wrap — 単一値や配列をコレクションに包む

collection
  • カテゴリ: collection
  • 掲載バージョン: Laravel 12・PHP 8.4
  • 名前空間 / FQCN / コマンド: Illuminate\Support\Collection::wrap
  • 関連: collect / Illuminate\Support\Collection::make / Illuminate\Support\Arr::wrap / Illuminate\Support\LazyCollection::wrap
  • 変更履歴: 5.x 以降で提供(Laravel 10〜12 で仕様差分ほぼなし)

要点(TL;DR)

  • 何に使うか:スカラー値・配列・コレクションを問わず、必ず Collection インスタンスに揃えるためのヘルパー
  • 最低限の使い方:$collection = Collection::wrap($value);
  • よくある罠
    • すでに Collection の場合でも 新しいインスタンス が返る(同一オブジェクトではない)
    • null を渡すと 空コレクション になる([null] ではない)
    • Eloquent の Collection をそのまま static 呼び出しすると IDE が補完しづらい(use Illuminate\Support\Collection; 推奨)

概要

Collection::wrap は、渡された値が配列かどうかを意識せずに「とにかくコレクション化したい」ときに使う静的メソッドです。
フォーム入力、設定値、外部 API のレスポンスなど、配列だったり単一値だったりするケース を一度 Collection に揃えて処理したい場面で役立ちます。
is_array チェックや Arr::wrap のラップ処理を毎回書かずに済むため、前処理ロジックを簡潔にできます。

構文 / シグネチャ

use Illuminate\Support\Collection;

$collection = Collection::wrap(mixed $value): Collection;

引数

引数必須既定値説明
$valuemixedなしコレクション化したい値。配列・CollectionEnumerable・スカラー・null など任意

戻り値

  • : Illuminate\Support\Collection
  • 意味:
    • $value
      • Collection / Enumerable のとき:その要素をコピーした新しい Collection
      • 配列のとき:その配列を要素に持つ Collection
      • スカラー値のとき:[$value] を要素に持つ Collection
      • null のとき:空の Collection(要素数 0)

例外 / 副作用

  • 例外: なし(通常の使用では例外を投げない)
  • 副作用: なし(引数が Collection の場合も非破壊で新インスタンスを返す)

使用例

最小例

<?php

use Illuminate\Support\Collection;

$value = 1;

$collection = Collection::wrap($value);

dump($collection->all()); // [1]

実務例:フォーム入力の単一/複数を同一処理に揃える

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Collection;

Route::post('/tags', function (Request $request) {
    // 'tags' が "php"(文字列)でも ["php", "laravel"](配列)でも、Collection に統一
    $tags = Collection::wrap($request->input('tags'))
        ->filter()          // 空要素を除外
        ->unique()          // 重複タグを除外
        ->values();         // 連番キーに整形

    // ここから先は $tags を Collection 前提で処理できる
    foreach ($tags as $tag) {
        // タグごとの処理
    }

    return response()->json([
        'tags' => $tags,
    ]);
});

よくある落とし穴・注意

  • すでに Collection の場合でも新しいインスタンス
    • Collection::wrap($collection)$collection と同じ要素を持ちますが、別オブジェクトです。
    • 元のコレクションをそのまま使いたいだけなら、ラップ不要です。
  • null が空コレクションになる
    • Collection::wrap(null)collect([]) と同じ。
    • null を要素として扱いたい場合は、自分で collect([null]) を使う必要があります。
  • 計算量
    • 内部的には配列コピーや all() が走るため、O(n) の処理。
    • 大きな配列やコレクションに対して頻繁に呼ぶと、無駄なコピーになることがあります。
  • LazyCollection とは別物
    • 遅延評価が欲しい場合は Illuminate\Support\LazyCollection::wrap を使うか、LazyCollection での生成を検討してください。

代替・関連APIとの比較

  • collect($value)
    • ほとんどのケースで同じ用途。
    • collect() はグローバル関数で、内部的に Collection::make / Collection のコンストラクタを使います。
    • プロジェクト方針として「静的メソッドで揃えたい」場合に Collection::wrap を選択。
  • Collection::make($value)
    • make も値からコレクションを作りますが、実装・挙動がバージョンにより異なる部分があります。
    • 「配列か単一値かを意識せずとにかく配列化 → コレクション」のパターンを明示したいなら wrap の方が意図が伝わりやすいです。
  • Arr::wrap($value)
    • 返り値が「配列」である点が異なります。
    • その後も配列として扱うなら Arr::wrap、コレクションチェーンに乗せる前提なら Collection::wrap を使い分けます。
  • LazyCollection::wrap($value)
    • 大量データやストリームを遅延評価で処理したい場合。
    • 通常の Collection は全要素をメモリに持つため、数十万件以上では LazyCollection の利用も検討。

入出力対応表(イメージ)

入力 $valueCollection::wrap($value)->all()
1[1]
'foo'['foo']
['a', 'b']['a', 'b']
null[]
collect([1, 2])[1, 2]
['id' => 1, 'name' => 'Laravel']['id' => 1, 'name' => 'Laravel']

キーはそのまま保持 されます。

テスト例(Pest)

<?php

use Illuminate\Support\Collection;

it('wraps scalar value into collection', function () {
    $collection = Collection::wrap('laravel');

    expect($collection)->toBeInstanceOf(Collection::class)
        ->and($collection->all())->toBe(['laravel']);
});

it('wraps null as empty collection', function () {
    $collection = Collection::wrap(null);

    expect($collection->count())->toBe(0);
});

it('clones existing collection elements', function () {
    $original = collect([1, 2, 3]);
    $wrapped  = Collection::wrap($original);

    expect($wrapped->all())->toBe($original->all())
        ->and($wrapped)->not->toBe($original); // 別インスタンス
});

トラブルシュート(エラー別)

症状/エラー原因対処
Call to undefined method ...::wrap()use Illuminate\Support\Collection; を忘れている、または別クラス名と衝突ファイル先頭で正しく use Illuminate\Support\Collection; を宣言する。別名を付ける場合は use Illuminate\Support\Collection as BaseCollection; などに統一
Call to a member function ... on nullCollection::wrap 結果ではなく、元の $value に対してメソッドを呼んでいる適切に $collection = Collection::wrap($value); を経由し、以降は $collection に対してメソッドチェーンする
メモリ使用量が増える大きな配列やコレクションに対して何度も wrap している同じデータを何度もラップしないようにロジックを整理するか、必要に応じて LazyCollection::wrap を利用する

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする