はじめに

Illuminate\Support\Collection クラスは、データの配列を操作するための流暢で便利なラッパーを提供します。例えば、次のコードを見てみましょう。collect ヘルパーを使用して配列から新しいコレクションインスタンスを作成し、各要素に strtoupper 関数を実行し、その後すべての空の要素を削除します:

  1. $collection = collect(['taylor', 'abigail', null])->map(function (?string $name) {
  2. return strtoupper($name);
  3. })->reject(function (string $name) {
  4. return empty($name);
  5. });

ご覧の通り、Collection クラスは、そのメソッドをチェーンして基礎となる配列の流暢なマッピングと削減を行うことを可能にします。一般的に、コレクションは不変であり、すべての Collection メソッドはまったく新しい Collection インスタンスを返します。

コレクションの作成

上記のように、collect ヘルパーは指定された配列の新しい Illuminate\Support\Collection インスタンスを返します。したがって、コレクションを作成するのは非常に簡単です:

  1. $collection = collect([1, 2, 3]);

Eloquent クエリの結果は常に Collection インスタンスとして返されます。

コレクションの拡張

コレクションは「マクロ可能」であり、実行時に Collection クラスに追加のメソッドを追加することができます。Illuminate\Support\Collection クラスの macro メソッドは、マクロが呼び出されたときに実行されるクロージャを受け入れます。マクロクロージャは、$this を介してコレクションの他のメソッドにアクセスできます。これは、コレクションクラスの実際のメソッドであるかのように扱われます。例えば、次のコードは toUpper メソッドを Collection クラスに追加します:

  1. use Illuminate\Support\Collection;
  2. use Illuminate\Support\Str;
  3. Collection::macro('toUpper', function () {
  4. return $this->map(function (string $value) {
  5. return Str::upper($value);
  6. });
  7. });
  8. $collection = collect(['first', 'second']);
  9. $upper = $collection->toUpper();
  10. // ['FIRST', 'SECOND']

通常、コレクションマクロは サービスプロバイダーboot メソッドで宣言するべきです。

マクロ引数

必要に応じて、追加の引数を受け入れるマクロを定義できます:

  1. use Illuminate\Support\Collection;
  2. use Illuminate\Support\Facades\Lang;
  3. Collection::macro('toLocale', function (string $locale) {
  4. return $this->map(function (string $value) use ($locale) {
  5. return Lang::get($value, [], $locale);
  6. });
  7. });
  8. $collection = collect(['first', 'second']);
  9. $translated = $collection->toLocale('es');

利用可能なメソッド

残りのコレクションドキュメントの大部分では、Collection クラスで利用可能な各メソッドについて説明します。これらのメソッドはすべて、基礎となる配列を流暢に操作するためにチェーンできます。さらに、ほとんどすべてのメソッドは新しい Collection インスタンスを返し、必要に応じてコレクションの元のコピーを保持できます:

after all average avg before chunk chunkWhile collapse collect combine concat contains containsOneItem containsStrict count countBy crossJoin dd diff diffAssoc diffAssocUsing diffKeys doesntContain dot dump duplicates duplicatesStrict each eachSpread ensure every except filter first firstOrFail firstWhere flatMap flatten flip forget forPage get groupBy has hasAny implode intersect intersectAssoc intersectByKeys isEmpty isNotEmpty join keyBy keys last lazy macro make map mapInto mapSpread mapToGroups mapWithKeys max median merge mergeRecursive min mode multiply nth only pad partition percentage pipe pipeInto pipeThrough pluck pop prepend pull push put random range reduce reduceSpread reject replace replaceRecursive reverse search select shift shuffle skip skipUntil skipWhile slice sliding sole some sort sortBy sortByDesc sortDesc sortKeys sortKeysDesc sortKeysUsing splice split splitIn sum take takeUntil takeWhile tap times toArray toJson transform undot union unique uniqueStrict unless unlessEmpty unlessNotEmpty unwrap value values when whenEmpty whenNotEmpty where whereStrict whereBetween whereIn whereInStrict whereInstanceOf whereNotBetween whereNotIn whereNotInStrict whereNotNull whereNull wrap zip

メソッドリスト

after()

after メソッドは、指定されたアイテムの後のアイテムを返します。指定されたアイテムが見つからない場合や最後のアイテムである場合は null が返されます:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->after(3);
  3. // 4
  4. $collection->after(5);
  5. // null

このメソッドは「緩い」比較を使用して指定されたアイテムを検索します。つまり、整数値を含む文字列は同じ値の整数と等しいと見なされます。「厳密」比較を使用するには、strict 引数をメソッドに提供できます:

  1. collect([2, 4, 6, 8])->after('4', strict: true);
  2. // null

または、指定された真実テストを通過する最初のアイテムを検索するために独自のクロージャを提供できます:

  1. collect([2, 4, 6, 8])->after(function (int $item, int $key) {
  2. return $item > 5;
  3. });
  4. // 8

all()

all メソッドは、コレクションによって表される基礎となる配列を返します:

  1. collect([1, 2, 3])->all();
  2. // [1, 2, 3]

average()

avg メソッドのエイリアスです。

avg()

avg メソッドは、指定されたキーの 平均値 を返します:

  1. $average = collect([
  2. ['foo' => 10],
  3. ['foo' => 10],
  4. ['foo' => 20],
  5. ['foo' => 40]
  6. ])->avg('foo');
  7. // 20
  8. $average = collect([1, 1, 2, 4])->avg();
  9. // 2

before()

before メソッドは、after メソッドの逆です。指定されたアイテムの前のアイテムを返します。指定されたアイテムが見つからない場合や最初のアイテムである場合は null が返されます:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->before(3);
  3. // 2
  4. $collection->before(1);
  5. // null
  6. collect([2, 4, 6, 8])->before('4', strict: true);
  7. // null
  8. collect([2, 4, 6, 8])->before(function (int $item, int $key) {
  9. return $item > 5;
  10. });
  11. // 4

chunk()

chunk メソッドは、コレクションを指定されたサイズの複数の小さなコレクションに分割します:

  1. $collection = collect([1, 2, 3, 4, 5, 6, 7]);
  2. $chunks = $collection->chunk(4);
  3. $chunks->all();
  4. // [[1, 2, 3, 4], [5, 6, 7]]

このメソッドは、Bootstrap のようなグリッドシステムで作業する際に ビュー で特に便利です。例えば、表示したい Eloquent モデルのコレクションがあると想像してください:

  1. @foreach ($products->chunk(3) as $chunk)
  2. <div class="row">
  3. @foreach ($chunk as $product)
  4. <div class="col-xs-4">{{ $product->name }}</div>
  5. @endforeach
  6. </div>
  7. @endforeach

chunkWhile()

chunkWhile メソッドは、指定されたコールバックの評価に基づいてコレクションを複数の小さなコレクションに分割します。クロージャに渡される $chunk 変数は、前の要素を検査するために使用できます:

  1. $collection = collect(str_split('AABBCCCD'));
  2. $chunks = $collection->chunkWhile(function (string $value, int $key, Collection $chunk) {
  3. return $value === $chunk->last();
  4. });
  5. $chunks->all();
  6. // [['A', 'A'], ['B', 'B'], ['C', 'C', 'C'], ['D']]

collapse()

collapse メソッドは、配列のコレクションを単一のフラットなコレクションに折りたたみます:

  1. $collection = collect([
  2. [1, 2, 3],
  3. [4, 5, 6],
  4. [7, 8, 9],
  5. ]);
  6. $collapsed = $collection->collapse();
  7. $collapsed->all();
  8. // [1, 2, 3, 4, 5, 6, 7, 8, 9]

collect()

collect メソッドは、現在コレクションにあるアイテムで新しい Collection インスタンスを返します:

  1. $collectionA = collect([1, 2, 3]);
  2. $collectionB = $collectionA->collect();
  3. $collectionB->all();
  4. // [1, 2, 3]

collect メソッドは、主に 遅延コレクション を標準の Collection インスタンスに変換するために便利です:

  1. $lazyCollection = LazyCollection::make(function () {
  2. yield 1;
  3. yield 2;
  4. yield 3;
  5. });
  6. $collection = $lazyCollection->collect();
  7. $collection::class;
  8. // 'Illuminate\Support\Collection'
  9. $collection->all();
  10. // [1, 2, 3]

collect メソッドは、Enumerable のインスタンスを持ち、非遅延コレクションインスタンスが必要な場合に特に便利です。collect()Enumerable コントラクトの一部であるため、Collection インスタンスを取得するために安全に使用できます。

combine()

combine メソッドは、コレクションの値をキーとして、別の配列またはコレクションの値と組み合わせます:

  1. $collection = collect(['name', 'age']);
  2. $combined = $collection->combine(['George', 29]);
  3. $combined->all();
  4. // ['name' => 'George', 'age' => 29]

concat()

concat メソッドは、指定された array またはコレクションの値を別のコレクションの末尾に追加します:

  1. $collection = collect(['John Doe']);
  2. $concatenated = $collection->concat(['Jane Doe'])->concat(['name' => 'Johnny Doe']);
  3. $concatenated->all();
  4. // ['John Doe', 'Jane Doe', 'Johnny Doe']

concat メソッドは、元のコレクションに追加されたアイテムのキーを数値的に再インデックスします。連想コレクションのキーを保持するには、merge メソッドを参照してください。

contains()

contains メソッドは、コレクションが指定されたアイテムを含むかどうかを判断します。指定された真実テストに一致する要素がコレクションに存在するかどうかを判断するために、contains メソッドにクロージャを渡すことができます:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->contains(function (int $value, int $key) {
  3. return $value > 5;
  4. });
  5. // false

また、contains メソッドに文字列を渡して、コレクションが指定されたアイテム値を含むかどうかを判断することもできます:

  1. $collection = collect(['name' => 'Desk', 'price' => 100]);
  2. $collection->contains('Desk');
  3. // true
  4. $collection->contains('New York');
  5. // false

また、contains メソッドにキー/値ペアを渡すこともでき、指定されたペアがコレクションに存在するかどうかを判断します:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 100],
  4. ]);
  5. $collection->contains('product', 'Bookcase');
  6. // false

contains メソッドは、アイテム値をチェックする際に「緩い」比較を使用します。つまり、整数値を持つ文字列は同じ値の整数と等しいと見なされます。containsStrict メソッドを使用して「厳密」比較を使用してフィルタリングします。

contains の逆については、doesntContain メソッドを参照してください。

containsOneItem()

containsOneItem メソッドは、コレクションが単一のアイテムを含むかどうかを判断します:

  1. collect([])->containsOneItem();
  2. // false
  3. collect(['1'])->containsOneItem();
  4. // true
  5. collect(['1', '2'])->containsOneItem();
  6. // false

containsStrict()

このメソッドは、contains メソッドと同じシグネチャを持っています。ただし、すべての値は「厳密」比較を使用して比較されます。

このメソッドの動作は、Eloquent Collections を使用する際に変更されます。

count()

count メソッドは、コレクション内のアイテムの総数を返します:

  1. $collection = collect([1, 2, 3, 4]);
  2. $collection->count();
  3. // 4

countBy()

countBy メソッドは、コレクション内の値の出現回数をカウントします。デフォルトでは、このメソッドはすべての要素の出現回数をカウントし、コレクション内の特定の「タイプ」の要素をカウントできます:

  1. $collection = collect([1, 2, 2, 2, 3]);
  2. $counted = $collection->countBy();
  3. $counted->all();
  4. // [1 => 1, 2 => 3, 3 => 1]

カスタム値でアイテムをすべてカウントするには、countBy メソッドにクロージャを渡します:

  1. $collection = collect(['', '', '']);
  2. $counted = $collection->countBy(function (string $email) {
  3. return substr(strrchr($email, "@"), 1);
  4. });
  5. $counted->all();
  6. // ['gmail.com' => 2, 'yahoo.com' => 1]

crossJoin()

crossJoin メソッドは、指定された配列またはコレクションの間でコレクションの値をクロス結合し、すべての可能な順列を持つデカルト積を返します:

  1. $collection = collect([1, 2]);
  2. $matrix = $collection->crossJoin(['a', 'b']);
  3. $matrix->all();
  4. /*
  5. [
  6. [1, 'a'],
  7. [1, 'b'],
  8. [2, 'a'],
  9. [2, 'b'],
  10. ]
  11. */
  12. $collection = collect([1, 2]);
  13. $matrix = $collection->crossJoin(['a', 'b'], ['I', 'II']);
  14. $matrix->all();
  15. /*
  16. [
  17. [1, 'a', 'I'],
  18. [1, 'a', 'II'],
  19. [1, 'b', 'I'],
  20. [1, 'b', 'II'],
  21. [2, 'a', 'I'],
  22. [2, 'a', 'II'],
  23. [2, 'b', 'I'],
  24. [2, 'b', 'II'],
  25. ]
  26. */

dd()

dd メソッドは、コレクションのアイテムをダンプし、スクリプトの実行を終了します:

  1. $collection = collect(['John Doe', 'Jane Doe']);
  2. $collection->dd();
  3. /*
  4. Collection {
  5. #items: array:2 [
  6. 0 => "John Doe"
  7. 1 => "Jane Doe"
  8. ]
  9. }
  10. */

スクリプトの実行を停止したくない場合は、代わりに dump メソッドを使用してください。

diff()

diff メソッドは、コレクションを別のコレクションまたはプレーンな PHP array と比較し、その値に基づいています。このメソッドは、指定されたコレクションに存在しない元のコレクションの値を返します:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $diff = $collection->diff([2, 4, 6, 8]);
  3. $diff->all();
  4. // [1, 3, 5]

このメソッドの動作は、Eloquent Collections を使用する際に変更されます。

diffAssoc()

diffAssoc メソッドは、コレクションを別のコレクションまたはプレーンな PHP array と比較し、そのキーと値に基づいています。このメソッドは、指定されたコレクションに存在しない元のコレクションのキー/値ペアを返します:

  1. $collection = collect([
  2. 'color' => 'orange',
  3. 'type' => 'fruit',
  4. 'remain' => 6,
  5. ]);
  6. $diff = $collection->diffAssoc([
  7. 'color' => 'yellow',
  8. 'type' => 'fruit',
  9. 'remain' => 3,
  10. 'used' => 6,
  11. ]);
  12. $diff->all();
  13. // ['color' => 'orange', 'remain' => 6]

diffAssocUsing()

diffAssoc とは異なり、diffAssocUsing はインデックス比較のためにユーザー提供のコールバック関数を受け入れます:

  1. $collection = collect([
  2. 'color' => 'orange',
  3. 'type' => 'fruit',
  4. 'remain' => 6,
  5. ]);
  6. $diff = $collection->diffAssocUsing([
  7. 'Color' => 'yellow',
  8. 'Type' => 'fruit',
  9. 'Remain' => 3,
  10. ], 'strnatcasecmp');
  11. $diff->all();
  12. // ['color' => 'orange', 'remain' => 6]

コールバックは、ゼロ未満、ゼロ、またはゼロより大きい整数を返す比較関数でなければなりません。詳細については、array_diff_uassoc に関する PHP ドキュメントを参照してください。これは、diffAssocUsing メソッドが内部で利用する PHP 関数です。

diffKeys()

diffKeys メソッドは、コレクションを別のコレクションまたはプレーンな PHP array と比較し、そのキーに基づいています。このメソッドは、指定されたコレクションに存在しない元のコレクションのキー/値ペアを返します:

  1. $collection = collect([
  2. 'one' => 10,
  3. 'two' => 20,
  4. 'three' => 30,
  5. 'four' => 40,
  6. 'five' => 50,
  7. ]);
  8. $diff = $collection->diffKeys([
  9. 'two' => 2,
  10. 'four' => 4,
  11. 'six' => 6,
  12. 'eight' => 8,
  13. ]);
  14. $diff->all();
  15. // ['one' => 10, 'three' => 30, 'five' => 50]

doesntContain()

doesntContain メソッドは、コレクションが指定されたアイテムを含まないかどうかを判断します。指定された真実テストに一致しない要素がコレクションに存在するかどうかを判断するために、doesntContain メソッドにクロージャを渡すことができます:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->doesntContain(function (int $value, int $key) {
  3. return $value < 5;
  4. });
  5. // false

また、doesntContain メソッドに文字列を渡して、コレクションが指定されたアイテム値を含まないかどうかを判断することもできます:

  1. $collection = collect(['name' => 'Desk', 'price' => 100]);
  2. $collection->doesntContain('Table');
  3. // true
  4. $collection->doesntContain('Desk');
  5. // false

また、doesntContain メソッドにキー/値ペアを渡すこともでき、指定されたペアがコレクションに存在しないかどうかを判断します:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 100],
  4. ]);
  5. $collection->doesntContain('product', 'Bookcase');
  6. // true

doesntContain メソッドは、アイテム値をチェックする際に「緩い」比較を使用します。つまり、整数値を持つ文字列は同じ値の整数と等しいと見なされます。

dot()

dot メソッドは、多次元コレクションを単一レベルのコレクションにフラット化し、「ドット」表記を使用して深さを示します:

  1. $collection = collect(['products' => ['desk' => ['price' => 100]]]);
  2. $flattened = $collection->dot();
  3. $flattened->all();
  4. // ['products.desk.price' => 100]

dump()

dump メソッドは、コレクションのアイテムをダンプします:

  1. $collection = collect(['John Doe', 'Jane Doe']);
  2. $collection->dump();
  3. /*
  4. Collection {
  5. #items: array:2 [
  6. 0 => "John Doe"
  7. 1 => "Jane Doe"
  8. ]
  9. }
  10. */

コレクションをダンプした後にスクリプトの実行を停止したい場合は、代わりに dd メソッドを使用してください。

duplicates()

duplicates メソッドは、コレクションから重複する値を取得して返します:

  1. $collection = collect(['a', 'b', 'a', 'c', 'b']);
  2. $collection->duplicates();
  3. // [2 => 'a', 4 => 'b']

コレクションに配列やオブジェクトが含まれている場合、重複する値をチェックしたい属性のキーを渡すことができます:

  1. $employees = collect([
  2. ['email' => '', 'position' => 'Developer'],
  3. ['email' => '', 'position' => 'Designer'],
  4. ['email' => '', 'position' => 'Developer'],
  5. ]);
  6. $employees->duplicates('position');
  7. // [2 => 'Developer']

duplicatesStrict()

このメソッドは、duplicates メソッドと同じシグネチャを持っています。ただし、すべての値は「厳密」比較を使用して比較されます。

each()

each メソッドは、コレクション内のアイテムを反復処理し、各アイテムをクロージャに渡します:

  1. $collection = collect([1, 2, 3, 4]);
  2. $collection->each(function (int $item, int $key) {
  3. // ...
  4. });

アイテムの反復処理を停止したい場合は、クロージャから false を返すことができます:

  1. $collection->each(function (int $item, int $key) {
  2. if (/* condition */) {
  3. return false;
  4. }
  5. });

eachSpread()

eachSpread メソッドは、コレクションのアイテムを反復処理し、各ネストされたアイテムの値を指定されたコールバックに渡します:

  1. $collection = collect([['John Doe', 35], ['Jane Doe', 33]]);
  2. $collection->eachSpread(function (string $name, int $age) {
  3. // ...
  4. });

コールバックから false を返すことで、アイテムの反復処理を停止できます:

  1. $collection->eachSpread(function (string $name, int $age) {
  2. return false;
  3. });

ensure()

ensure メソッドは、コレクションのすべての要素が指定されたタイプまたはタイプのリストであることを確認するために使用できます。そうでない場合、UnexpectedValueException がスローされます:

  1. return $collection->ensure(User::class);
  2. return $collection->ensure([User::class, Customer::class]);

stringintfloatboolarray などのプリミティブタイプも指定できます:

  1. return $collection->ensure('int');

ensure メソッドは、異なるタイプの要素が後でコレクションに追加されないことを保証しません。

every()

every メソッドは、コレクションのすべての要素が指定された真実テストを通過することを確認するために使用できます:

  1. collect([1, 2, 3, 4])->every(function (int $value, int $key) {
  2. return $value > 2;
  3. });
  4. // false

コレクションが空の場合、every メソッドは true を返します:

  1. $collection = collect([]);
  2. $collection->every(function (int $value, int $key) {
  3. return $value > 2;
  4. });
  5. // true

except()

except メソッドは、指定されたキーを持つアイテムを除くコレクション内のすべてのアイテムを返します:

  1. $collection = collect(['product_id' => 1, 'price' => 100, 'discount' => false]);
  2. $filtered = $collection->except(['price', 'discount']);
  3. $filtered->all();
  4. // ['product_id' => 1]

except の逆については、only メソッドを参照してください。

このメソッドの動作は、Eloquent Collections を使用する際に変更されます。

filter()

filter メソッドは、指定されたコールバックを使用してコレクションをフィルタリングし、指定された真実テストを通過するアイテムのみを保持します:

  1. $collection = collect([1, 2, 3, 4]);
  2. $filtered = $collection->filter(function (int $value, int $key) {
  3. return $value > 2;
  4. });
  5. $filtered->all();
  6. // [3, 4]

コールバックが提供されていない場合、false と等しいコレクションのすべてのエントリが削除されます:

  1. $collection = collect([1, 2, 3, null, false, '', 0, []]);
  2. $collection->filter()->all();
  3. // [1, 2, 3]

filter の逆については、reject メソッドを参照してください。

first()

first メソッドは、指定された真実テストを通過するコレクション内の最初の要素を返します:

  1. collect([1, 2, 3, 4])->first(function (int $value, int $key) {
  2. return $value > 2;
  3. });
  4. // 3

引数なしで first メソッドを呼び出して、コレクション内の最初の要素を取得することもできます。コレクションが空の場合、null が返されます:

  1. collect([1, 2, 3, 4])->first();
  2. // 1

firstOrFail()

firstOrFail メソッドは first メソッドと同一です。ただし、結果が見つからない場合は、Illuminate\Support\ItemNotFoundException 例外がスローされます:

  1. collect([1, 2, 3, 4])->firstOrFail(function (int $value, int $key) {
  2. return $value > 5;
  3. });
  4. // Throws ItemNotFoundException...

引数なしで firstOrFail メソッドを呼び出して、コレクション内の最初の要素を取得することもできます。コレクションが空の場合、Illuminate\Support\ItemNotFoundException 例外がスローされます:

  1. collect([])->firstOrFail();
  2. // Throws ItemNotFoundException...

firstWhere()

firstWhere メソッドは、指定されたキー/値ペアを持つコレクション内の最初の要素を返します:

  1. $collection = collect([
  2. ['name' => 'Regena', 'age' => null],
  3. ['name' => 'Linda', 'age' => 14],
  4. ['name' => 'Diego', 'age' => 23],
  5. ['name' => 'Linda', 'age' => 84],
  6. ]);
  7. $collection->firstWhere('name', 'Linda');
  8. // ['name' => 'Linda', 'age' => 14]

比較演算子を使用して firstWhere メソッドを呼び出すこともできます:

  1. $collection->firstWhere('age', '>=', 18);
  2. // ['name' => 'Diego', 'age' => 23]

where メソッドと同様に、firstWhere メソッドに1つの引数を渡すことができます。このシナリオでは、firstWhere メソッドは、指定されたアイテムキーの値が「真」である最初のアイテムを返します:

  1. $collection->firstWhere('age');
  2. // ['name' => 'Linda', 'age' => 14]

flatMap()

flatMap メソッドは、コレクションを反復処理し、各値を指定されたクロージャに渡します。クロージャはアイテムを変更して返すことができ、新しい変更されたアイテムのコレクションを形成します。その後、配列は1レベルフラット化されます:

  1. $collection = collect([
  2. ['name' => 'Sally'],
  3. ['school' => 'Arkansas'],
  4. ['age' => 28]
  5. ]);
  6. $flattened = $collection->flatMap(function (array $values) {
  7. return array_map('strtoupper', $values);
  8. });
  9. $flattened->all();
  10. // ['name' => 'SALLY', 'school' => 'ARKANSAS', 'age' => '28'];

flatten()

flatten メソッドは、多次元コレクションを単一次元にフラット化します:

  1. $collection = collect([
  2. 'name' => 'taylor',
  3. 'languages' => [
  4. 'php', 'javascript'
  5. ]
  6. ]);
  7. $flattened = $collection->flatten();
  8. $flattened->all();
  9. // ['taylor', 'php', 'javascript'];

必要に応じて、flatten メソッドに「深さ」引数を渡すことができます:

  1. $collection = collect([
  2. 'Apple' => [
  3. [
  4. 'name' => 'iPhone 6S',
  5. 'brand' => 'Apple'
  6. ],
  7. ],
  8. 'Samsung' => [
  9. [
  10. 'name' => 'Galaxy S7',
  11. 'brand' => 'Samsung'
  12. ],
  13. ],
  14. ]);
  15. $products = $collection->flatten(1);
  16. $products->values()->all();
  17. /*
  18. [
  19. ['name' => 'iPhone 6S', 'brand' => 'Apple'],
  20. ['name' => 'Galaxy S7', 'brand' => 'Samsung'],
  21. ]
  22. */

この例では、深さを指定せずに flatten を呼び出すと、ネストされた配列もフラット化され、['iPhone 6S', 'Apple', 'Galaxy S7', 'Samsung'] になります。深さを指定することで、ネストされた配列がフラット化されるレベルの数を指定できます。

flip()

flip メソッドは、コレクションのキーを対応する値と入れ替えます:

  1. $collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
  2. $flipped = $collection->flip();
  3. $flipped->all();
  4. // ['taylor' => 'name', 'laravel' => 'framework']

forget()

forget メソッドは、キーによってコレクションからアイテムを削除します:

  1. $collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
  2. // Forget a single key...
  3. $collection->forget('name');
  4. // ['framework' => 'laravel']
  5. // Forget multiple keys...
  6. $collection->forget(['name', 'framework']);
  7. // []

他のほとんどのコレクションメソッドとは異なり、forget は新しい変更されたコレクションを返さず、呼び出されたコレクションを変更します。

forPage()

forPage メソッドは、指定されたページ番号に存在するアイテムを含む新しいコレクションを返します。このメソッドは、ページ番号を最初の引数として、ページごとに表示するアイテムの数を2番目の引数として受け取ります:

  1. $collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]);
  2. $chunk = $collection->forPage(2, 3);
  3. $chunk->all();
  4. // [4, 5, 6]

get()

get メソッドは、指定されたキーのアイテムを返します。キーが存在しない場合、null が返されます:

  1. $collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
  2. $value = $collection->get('name');
  3. // taylor

デフォルト値を第二引数としてオプションで渡すことができます:

  1. $collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
  2. $value = $collection->get('age', 34);
  3. // 34

指定されたキーが存在しない場合、コールバックをメソッドのデフォルト値として渡すこともできます。コールバックの結果が返されます:

  1. $collection->get('email', function () {
  2. return '';
  3. });
  4. //

groupBy()

groupBy メソッドは、コレクションのアイテムを指定されたキーでグループ化します:

  1. $collection = collect([
  2. ['account_id' => 'account-x10', 'product' => 'Chair'],
  3. ['account_id' => 'account-x10', 'product' => 'Bookcase'],
  4. ['account_id' => 'account-x11', 'product' => 'Desk'],
  5. ]);
  6. $grouped = $collection->groupBy('account_id');
  7. $grouped->all();
  8. /*
  9. [
  10. 'account-x10' => [
  11. ['account_id' => 'account-x10', 'product' => 'Chair'],
  12. ['account_id' => 'account-x10', 'product' => 'Bookcase'],
  13. ],
  14. 'account-x11' => [
  15. ['account_id' => 'account-x11', 'product' => 'Desk'],
  16. ],
  17. ]
  18. */

文字列 key を渡す代わりに、コールバックを渡すことができます。コールバックは、グループ化する値を返す必要があります:

  1. $grouped = $collection->groupBy(function (array $item, int $key) {
  2. return substr($item['account_id'], -3);
  3. });
  4. $grouped->all();
  5. /*
  6. [
  7. 'x10' => [
  8. ['account_id' => 'account-x10', 'product' => 'Chair'],
  9. ['account_id' => 'account-x10', 'product' => 'Bookcase'],
  10. ],
  11. 'x11' => [
  12. ['account_id' => 'account-x11', 'product' => 'Desk'],
  13. ],
  14. ]
  15. */

複数のグループ化基準を配列として渡すことができます。各配列要素は、多次元配列内の対応するレベルに適用されます:

  1. $data = new Collection([
  2. 10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],
  3. 20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],
  4. 30 => ['user' => 3, 'skill' => 2, 'roles' => ['Role_1']],
  5. 40 => ['user' => 4, 'skill' => 2, 'roles' => ['Role_2']],
  6. ]);
  7. $result = $data->groupBy(['skill', function (array $item) {
  8. return $item['roles'];
  9. }], preserveKeys: true);
  10. /*
  11. [
  12. 1 => [
  13. 'Role_1' => [
  14. 10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],
  15. 20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],
  16. ],
  17. 'Role_2' => [
  18. 20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],
  19. ],
  20. 'Role_3' => [
  21. 10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],
  22. ],
  23. ],
  24. 2 => [
  25. 'Role_1' => [
  26. 30 => ['user' => 3, 'skill' => 2, 'roles' => ['Role_1']],
  27. ],
  28. 'Role_2' => [
  29. 40 => ['user' => 4, 'skill' => 2, 'roles' => ['Role_2']],
  30. ],
  31. ],
  32. ];
  33. */

has()

has メソッドは、指定されたキーがコレクションに存在するかどうかを判断します:

  1. $collection = collect(['account_id' => 1, 'product' => 'Desk', 'amount' => 5]);
  2. $collection->has('product');
  3. // true
  4. $collection->has(['product', 'amount']);
  5. // true
  6. $collection->has(['amount', 'price']);
  7. // false

hasAny()

hasAny メソッドは、指定されたキーのいずれかがコレクションに存在するかどうかを判断します:

  1. $collection = collect(['account_id' => 1, 'product' => 'Desk', 'amount' => 5]);
  2. $collection->hasAny(['product', 'price']);
  3. // true
  4. $collection->hasAny(['name', 'price']);
  5. // false

implode()

implode メソッドは、コレクション内のアイテムを結合します。その引数は、コレクション内のアイテムのタイプによって異なります。コレクションに配列やオブジェクトが含まれている場合、結合したい属性のキーと、値の間に置きたい「接着剤」文字列を渡す必要があります:

  1. $collection = collect([
  2. ['account_id' => 1, 'product' => 'Desk'],
  3. ['account_id' => 2, 'product' => 'Chair'],
  4. ]);
  5. $collection->implode('product', ', ');
  6. // Desk, Chair

コレクションに単純な文字列や数値が含まれている場合、「接着剤」を唯一の引数としてメソッドに渡す必要があります:

  1. collect([1, 2, 3, 4, 5])->implode('-');
  2. // '1-2-3-4-5'

値をフォーマットしたい場合は、implode メソッドにクロージャを渡すことができます:

  1. $collection->implode(function (array $item, int $key) {
  2. return strtoupper($item['product']);
  3. }, ', ');
  4. // DESK, CHAIR

intersect()

intersect メソッドは、指定された array またはコレクションに存在しない元のコレクションから値を削除します。結果のコレクションは、元のコレクションのキーを保持します:

  1. $collection = collect(['Desk', 'Sofa', 'Chair']);
  2. $intersect = $collection->intersect(['Desk', 'Chair', 'Bookcase']);
  3. $intersect->all();
  4. // [0 => 'Desk', 2 => 'Chair']

このメソッドの動作は、Eloquent Collections を使用する際に変更されます。

intersectAssoc()

intersectAssoc メソッドは、元のコレクションを別のコレクションまたは array と比較し、すべての指定されたコレクションに存在するキー/値ペアを返します:

  1. $collection = collect([
  2. 'color' => 'red',
  3. 'size' => 'M',
  4. 'material' => 'cotton'
  5. ]);
  6. $intersect = $collection->intersectAssoc([
  7. 'color' => 'blue',
  8. 'size' => 'M',
  9. 'material' => 'polyester'
  10. ]);
  11. $intersect->all();
  12. // ['size' => 'M']

intersectByKeys()

intersectByKeys メソッドは、指定された array またはコレクションに存在しない元のコレクションからキーとその対応する値を削除します:

  1. $collection = collect([
  2. 'serial' => 'UX301', 'type' => 'screen', 'year' => 2009,
  3. ]);
  4. $intersect = $collection->intersectByKeys([
  5. 'reference' => 'UX404', 'type' => 'tab', 'year' => 2011,
  6. ]);
  7. $intersect->all();
  8. // ['type' => 'screen', 'year' => 2009]

isEmpty()

isEmpty メソッドは、コレクションが空の場合 true を返します。そうでない場合は false が返されます:

  1. collect([])->isEmpty();
  2. // true

isNotEmpty()

isNotEmpty メソッドは、コレクションが空でない場合 true を返します。そうでない場合は false が返されます:

  1. collect([])->isNotEmpty();
  2. // false

join()

join メソッドは、コレクションの値を文字列で結合します。このメソッドの第二引数を使用して、最終要素を文字列にどのように追加するかを指定することもできます:

  1. collect(['a', 'b', 'c'])->join(', '); // 'a, b, c'
  2. collect(['a', 'b', 'c'])->join(', ', ', and '); // 'a, b, and c'
  3. collect(['a', 'b'])->join(', ', ' and '); // 'a and b'
  4. collect(['a'])->join(', ', ' and '); // 'a'
  5. collect([])->join(', ', ' and '); // ''

keyBy()

keyBy メソッドは、指定されたキーでコレクションをキー付けします。複数のアイテムが同じキーを持つ場合、新しいコレクションには最後のものだけが表示されます:

  1. $collection = collect([
  2. ['product_id' => 'prod-100', 'name' => 'Desk'],
  3. ['product_id' => 'prod-200', 'name' => 'Chair'],
  4. ]);
  5. $keyed = $collection->keyBy('product_id');
  6. $keyed->all();
  7. /*
  8. [
  9. 'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
  10. 'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
  11. ]
  12. */

メソッドにコールバックを渡すこともできます。コールバックは、コレクションをキー付けするための値を返す必要があります:

  1. $keyed = $collection->keyBy(function (array $item, int $key) {
  2. return strtoupper($item['product_id']);
  3. });
  4. $keyed->all();
  5. /*
  6. [
  7. 'PROD-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
  8. 'PROD-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
  9. ]
  10. */

keys()

keys メソッドは、コレクションのすべてのキーを返します:

  1. $collection = collect([
  2. 'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
  3. 'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
  4. ]);
  5. $keys = $collection->keys();
  6. $keys->all();
  7. // ['prod-100', 'prod-200']

last()

last メソッドは、指定された真理テストを通過するコレクション内の最後の要素を返します:

  1. collect([1, 2, 3, 4])->last(function (int $value, int $key) {
  2. return $value < 3;
  3. });
  4. // 2

引数なしで last メソッドを呼び出すことでも、コレクション内の最後の要素を取得できます。コレクションが空の場合、null が返されます:

  1. collect([1, 2, 3, 4])->last();
  2. // 4

lazy()

lazy メソッドは、アイテムの基になる配列から新しい LazyCollection インスタンスを返します:

  1. $lazyCollection = collect([1, 2, 3, 4])->lazy();
  2. $lazyCollection::class;
  3. // Illuminate\Support\LazyCollection
  4. $lazyCollection->all();
  5. // [1, 2, 3, 4]

これは、非常に多くのアイテムを含む巨大な Collection に対して変換を行う必要がある場合に特に便利です:

  1. $count = $hugeCollection
  2. ->lazy()
  3. ->where('country', 'FR')
  4. ->where('balance', '>', '100')
  5. ->count();

コレクションを LazyCollection に変換することで、追加のメモリを大量に割り当てる必要がなくなります。元のコレクションはメモリ内に その 値を保持し続けますが、後続のフィルターは保持しません。したがって、コレクションの結果をフィルタリングする際に、実質的に追加のメモリは割り当てられません。

macro()

macro 静的メソッドを使用すると、実行時に Collection クラスにメソッドを追加できます。詳細については、コレクションの拡張 に関するドキュメントを参照してください。

make()

make 静的メソッドは、新しいコレクションインスタンスを作成します。コレクションの作成 セクションを参照してください。

map()

map メソッドはコレクションを反復処理し、各値を指定されたコールバックに渡します。コールバックはアイテムを変更して返すことができ、新しい変更されたアイテムのコレクションを形成します:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $multiplied = $collection->map(function (int $item, int $key) {
  3. return $item * 2;
  4. });
  5. $multiplied->all();
  6. // [2, 4, 6, 8, 10]

他のほとんどのコレクションメソッドと同様に、map は新しいコレクションインスタンスを返します; 呼び出されたコレクションを変更しません。元のコレクションを変換したい場合は、transform メソッドを使用してください。

mapInto()

mapInto() メソッドはコレクションを反復処理し、値をコンストラクタに渡して指定されたクラスの新しいインスタンスを作成します:

  1. class Currency
  2. {
  3. /**
  4. * Create a new currency instance.
  5. */
  6. function __construct(
  7. public string $code,
  8. ) {}
  9. }
  10. $collection = collect(['USD', 'EUR', 'GBP']);
  11. $currencies = $collection->mapInto(Currency::class);
  12. $currencies->all();
  13. // [Currency('USD'), Currency('EUR'), Currency('GBP')]

mapSpread()

mapSpread メソッドはコレクションのアイテムを反復処理し、各ネストされたアイテムの値を指定されたクロージャに渡します。クロージャはアイテムを変更して返すことができ、新しい変更されたアイテムのコレクションを形成します:

  1. $collection = collect([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
  2. $chunks = $collection->chunk(2);
  3. $sequence = $chunks->mapSpread(function (int $even, int $odd) {
  4. return $even + $odd;
  5. });
  6. $sequence->all();
  7. // [1, 5, 9, 13, 17]

mapToGroups()

mapToGroups メソッドは、指定されたクロージャによってコレクションのアイテムをグループ化します。クロージャは、単一のキー/値ペアを含む連想配列を返す必要があり、これによりグループ化された値の新しいコレクションが形成されます:

  1. $collection = collect([
  2. [
  3. 'name' => 'John Doe',
  4. 'department' => 'Sales',
  5. ],
  6. [
  7. 'name' => 'Jane Doe',
  8. 'department' => 'Sales',
  9. ],
  10. [
  11. 'name' => 'Johnny Doe',
  12. 'department' => 'Marketing',
  13. ]
  14. ]);
  15. $grouped = $collection->mapToGroups(function (array $item, int $key) {
  16. return [$item['department'] => $item['name']];
  17. });
  18. $grouped->all();
  19. /*
  20. [
  21. 'Sales' => ['John Doe', 'Jane Doe'],
  22. 'Marketing' => ['Johnny Doe'],
  23. ]
  24. */
  25. $grouped->get('Sales')->all();
  26. // ['John Doe', 'Jane Doe']

mapWithKeys()

mapWithKeys メソッドはコレクションを反復処理し、各値を指定されたコールバックに渡します。コールバックは単一のキー/値ペアを含む連想配列を返す必要があります:

  1. $collection = collect([
  2. [
  3. 'name' => 'John',
  4. 'department' => 'Sales',
  5. 'email' => '',
  6. ],
  7. [
  8. 'name' => 'Jane',
  9. 'department' => 'Marketing',
  10. 'email' => '',
  11. ]
  12. ]);
  13. $keyed = $collection->mapWithKeys(function (array $item, int $key) {
  14. return [$item['email'] => $item['name']];
  15. });
  16. $keyed->all();
  17. /*
  18. [
  19. '' => 'John',
  20. '' => 'Jane',
  21. ]
  22. */

max()

max メソッドは、指定されたキーの最大値を返します:

  1. $max = collect([
  2. ['foo' => 10],
  3. ['foo' => 20]
  4. ])->max('foo');
  5. // 20
  6. $max = collect([1, 2, 3, 4, 5])->max();
  7. // 5

median()

median メソッドは、指定されたキーの 中央値 を返します:

  1. $median = collect([
  2. ['foo' => 10],
  3. ['foo' => 10],
  4. ['foo' => 20],
  5. ['foo' => 40]
  6. ])->median('foo');
  7. // 15
  8. $median = collect([1, 1, 2, 4])->median();
  9. // 1.5

merge()

merge メソッドは、指定された配列またはコレクションを元のコレクションとマージします。指定されたアイテムの文字列キーが元のコレクションの文字列キーと一致する場合、指定されたアイテムの値は元のコレクションの値を上書きします:

  1. $collection = collect(['product_id' => 1, 'price' => 100]);
  2. $merged = $collection->merge(['price' => 200, 'discount' => false]);
  3. $merged->all();
  4. // ['product_id' => 1, 'price' => 200, 'discount' => false]

指定されたアイテムのキーが数値の場合、値はコレクションの末尾に追加されます:

  1. $collection = collect(['Desk', 'Chair']);
  2. $merged = $collection->merge(['Bookcase', 'Door']);
  3. $merged->all();
  4. // ['Desk', 'Chair', 'Bookcase', 'Door']

mergeRecursive()

mergeRecursive メソッドは、指定された配列またはコレクションを元のコレクションと再帰的にマージします。指定されたアイテムの文字列キーが元のコレクションの文字列キーと一致する場合、これらのキーの値は配列にマージされ、これは再帰的に行われます:

  1. $collection = collect(['product_id' => 1, 'price' => 100]);
  2. $merged = $collection->mergeRecursive([
  3. 'product_id' => 2,
  4. 'price' => 200,
  5. 'discount' => false
  6. ]);
  7. $merged->all();
  8. // ['product_id' => [1, 2], 'price' => [100, 200], 'discount' => false]

min()

min メソッドは、指定されたキーの最小値を返します:

  1. $min = collect([['foo' => 10], ['foo' => 20]])->min('foo');
  2. // 10
  3. $min = collect([1, 2, 3, 4, 5])->min();
  4. // 1

mode()

mode メソッドは、指定されたキーの 最頻値 を返します:

  1. $mode = collect([
  2. ['foo' => 10],
  3. ['foo' => 10],
  4. ['foo' => 20],
  5. ['foo' => 40]
  6. ])->mode('foo');
  7. // [10]
  8. $mode = collect([1, 1, 2, 4])->mode();
  9. // [1]
  10. $mode = collect([1, 1, 2, 2])->mode();
  11. // [1, 2]

multiply()

multiply メソッドは、コレクション内のすべてのアイテムの指定された数のコピーを作成します:

  1. $users = collect([
  2. ['name' => 'User #1', 'email' => ''],
  3. ['name' => 'User #2', 'email' => ''],
  4. ])->multiply(3);
  5. /*
  6. [
  7. ['name' => 'User #1', 'email' => ''],
  8. ['name' => 'User #2', 'email' => ''],
  9. ['name' => 'User #1', 'email' => ''],
  10. ['name' => 'User #2', 'email' => ''],
  11. ['name' => 'User #1', 'email' => ''],
  12. ['name' => 'User #2', 'email' => ''],
  13. ]
  14. */

nth()

nth メソッドは、n 番目の要素からなる新しいコレクションを作成します:

  1. $collection = collect(['a', 'b', 'c', 'd', 'e', 'f']);
  2. $collection->nth(4);
  3. // ['a', 'e']

オプションで、2 番目の引数として開始オフセットを渡すことができます:

  1. $collection->nth(4, 1);
  2. // ['b', 'f']

only()

only メソッドは、指定されたキーを持つコレクション内のアイテムを返します:

  1. $collection = collect([
  2. 'product_id' => 1,
  3. 'name' => 'Desk',
  4. 'price' => 100,
  5. 'discount' => false
  6. ]);
  7. $filtered = $collection->only(['product_id', 'name']);
  8. $filtered->all();
  9. // ['product_id' => 1, 'name' => 'Desk']

only の逆については、except メソッドを参照してください。

このメソッドの動作は、Eloquent Collections を使用する際に変更されます。

pad()

pad メソッドは、配列が指定されたサイズに達するまで、指定された値で配列を埋めます。このメソッドは、array_pad PHP 関数のように動作します。

左にパッドするには、負のサイズを指定する必要があります。指定されたサイズの絶対値が配列の長さ以下の場合、パッドは行われません:

  1. $collection = collect(['A', 'B', 'C']);
  2. $filtered = $collection->pad(5, 0);
  3. $filtered->all();
  4. // ['A', 'B', 'C', 0, 0]
  5. $filtered = $collection->pad(-5, 0);
  6. $filtered->all();
  7. // [0, 0, 'A', 'B', 'C']

partition()

partition メソッドは、PHP の配列分解と組み合わせて、指定された真理テストを通過する要素と通過しない要素を分けることができます:

  1. $collection = collect([1, 2, 3, 4, 5, 6]);
  2. [$underThree, $equalOrAboveThree] = $collection->partition(function (int $i) {
  3. return $i < 3;
  4. });
  5. $underThree->all();
  6. // [1, 2]
  7. $equalOrAboveThree->all();
  8. // [3, 4, 5, 6]

percentage()

percentage メソッドは、指定された真理テストを通過するコレクション内のアイテムの割合を迅速に決定するために使用できます:

  1. $collection = collect([1, 1, 2, 2, 2, 3]);
  2. $percentage = $collection->percentage(fn ($value) => $value === 1);
  3. // 33.33

デフォルトでは、割合は小数点以下 2 桁に丸められます。ただし、メソッドに 2 番目の引数を提供することで、この動作をカスタマイズできます:

  1. $percentage = $collection->percentage(fn ($value) => $value === 1, precision: 3);
  2. // 33.333

pipe()

pipe メソッドは、コレクションを指定されたクロージャに渡し、実行されたクロージャの結果を返します:

  1. $collection = collect([1, 2, 3]);
  2. $piped = $collection->pipe(function (Collection $collection) {
  3. return $collection->sum();
  4. });
  5. // 6

pipeInto()

pipeInto メソッドは、指定されたクラスの新しいインスタンスを作成し、コレクションをコンストラクタに渡します:

  1. class ResourceCollection
  2. {
  3. /**
  4. * Create a new ResourceCollection instance.
  5. */
  6. public function __construct(
  7. public Collection $collection,
  8. ) {}
  9. }
  10. $collection = collect([1, 2, 3]);
  11. $resource = $collection->pipeInto(ResourceCollection::class);
  12. $resource->collection->all();
  13. // [1, 2, 3]

pipeThrough()

pipeThrough メソッドは、コレクションを指定されたクロージャの配列に渡し、実行されたクロージャの結果を返します:

  1. use Illuminate\Support\Collection;
  2. $collection = collect([1, 2, 3]);
  3. $result = $collection->pipeThrough([
  4. function (Collection $collection) {
  5. return $collection->merge([4, 5]);
  6. },
  7. function (Collection $collection) {
  8. return $collection->sum();
  9. },
  10. ]);
  11. // 15

pluck()

pluck メソッドは、指定されたキーのすべての値を取得します:

  1. $collection = collect([
  2. ['product_id' => 'prod-100', 'name' => 'Desk'],
  3. ['product_id' => 'prod-200', 'name' => 'Chair'],
  4. ]);
  5. $plucked = $collection->pluck('name');
  6. $plucked->all();
  7. // ['Desk', 'Chair']

結果のコレクションのキーの指定方法も指定できます:

  1. $plucked = $collection->pluck('name', 'product_id');
  2. $plucked->all();
  3. // ['prod-100' => 'Desk', 'prod-200' => 'Chair']

pluck メソッドは、”ドット” 表記を使用してネストされた値を取得することもサポートしています:

  1. $collection = collect([
  2. [
  3. 'name' => 'Laracon',
  4. 'speakers' => [
  5. 'first_day' => ['Rosa', 'Judith'],
  6. ],
  7. ],
  8. [
  9. 'name' => 'VueConf',
  10. 'speakers' => [
  11. 'first_day' => ['Abigail', 'Joey'],
  12. ],
  13. ],
  14. ]);
  15. $plucked = $collection->pluck('speakers.first_day');
  16. $plucked->all();
  17. // [['Rosa', 'Judith'], ['Abigail', 'Joey']]

重複するキーが存在する場合、最後の一致する要素がプルックされたコレクションに挿入されます:

  1. $collection = collect([
  2. ['brand' => 'Tesla', 'color' => 'red'],
  3. ['brand' => 'Pagani', 'color' => 'white'],
  4. ['brand' => 'Tesla', 'color' => 'black'],
  5. ['brand' => 'Pagani', 'color' => 'orange'],
  6. ]);
  7. $plucked = $collection->pluck('color', 'brand');
  8. $plucked->all();
  9. // ['Tesla' => 'black', 'Pagani' => 'orange']

pop()

pop メソッドは、コレクションから最後のアイテムを削除して返します:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->pop();
  3. // 5
  4. $collection->all();
  5. // [1, 2, 3, 4]

pop メソッドに整数を渡すことで、コレクションの末尾から複数のアイテムを削除して返すことができます:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->pop(3);
  3. // collect([5, 4, 3])
  4. $collection->all();
  5. // [1, 2]

prepend()

prepend メソッドは、コレクションの先頭にアイテムを追加します:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->prepend(0);
  3. $collection->all();
  4. // [0, 1, 2, 3, 4, 5]

追加されたアイテムのキーを指定するために、2 番目の引数を渡すこともできます:

  1. $collection = collect(['one' => 1, 'two' => 2]);
  2. $collection->prepend(0, 'zero');
  3. $collection->all();
  4. // ['zero' => 0, 'one' => 1, 'two' => 2]

pull()

pull メソッドは、キーによってコレクションからアイテムを削除して返します:

  1. $collection = collect(['product_id' => 'prod-100', 'name' => 'Desk']);
  2. $collection->pull('name');
  3. // 'Desk'
  4. $collection->all();
  5. // ['product_id' => 'prod-100']

push()

push メソッドは、コレクションの末尾にアイテムを追加します:

  1. $collection = collect([1, 2, 3, 4]);
  2. $collection->push(5);
  3. $collection->all();
  4. // [1, 2, 3, 4, 5]

put()

put メソッドは、コレクションに指定されたキーと値を設定します:

  1. $collection = collect(['product_id' => 1, 'name' => 'Desk']);
  2. $collection->put('price', 100);
  3. $collection->all();
  4. // ['product_id' => 1, 'name' => 'Desk', 'price' => 100]

random()

random メソッドは、コレクションからランダムなアイテムを返します:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->random();
  3. // 4 - (retrieved randomly)

random に整数を渡すことで、ランダムに取得したいアイテムの数を指定できます。取得したいアイテムの数を明示的に渡すと、アイテムのコレクションが常に返されます:

  1. $random = $collection->random(3);
  2. $random->all();
  3. // [2, 4, 5] - (retrieved randomly)

コレクションインスタンスに要求されたアイテムよりも少ないアイテムがある場合、random メソッドは InvalidArgumentException をスローします。

random メソッドは、現在のコレクションインスタンスを受け取るクロージャも受け入れます:

  1. use Illuminate\Support\Collection;
  2. $random = $collection->random(fn (Collection $items) => min(10, count($items)));
  3. $random->all();
  4. // [1, 2, 3, 4, 5] - (retrieved randomly)

range()

range メソッドは、指定された範囲内の整数を含むコレクションを返します:

  1. $collection = collect()->range(3, 6);
  2. $collection->all();
  3. // [3, 4, 5, 6]

reduce()

reduce メソッドは、コレクションを単一の値に減らし、各反復の結果を次の反復に渡します:

  1. $collection = collect([1, 2, 3]);
  2. $total = $collection->reduce(function (?int $carry, int $item) {
  3. return $carry + $item;
  4. });
  5. // 6

最初の反復の $carry の値は null ですが、reduce に 2 番目の引数を渡すことで初期値を指定できます:

  1. $collection->reduce(function (int $carry, int $item) {
  2. return $carry + $item;
  3. }, 4);
  4. // 10

reduce メソッドは、連想コレクション内の配列キーも指定されたコールバックに渡します:

  1. $collection = collect([
  2. 'usd' => 1400,
  3. 'gbp' => 1200,
  4. 'eur' => 1000,
  5. ]);
  6. $ratio = [
  7. 'usd' => 1,
  8. 'gbp' => 1.37,
  9. 'eur' => 1.22,
  10. ];
  11. $collection->reduce(function (int $carry, int $value, int $key) use ($ratio) {
  12. return $carry + ($value * $ratio[$key]);
  13. });
  14. // 4264

reduceSpread()

reduceSpread メソッドは、コレクションを値の配列に減らし、各反復の結果を次の反復に渡します。このメソッドは reduce メソッドに似ていますが、複数の初期値を受け入れることができます:

  1. [$creditsRemaining, $batch] = Image::where('status', 'unprocessed')
  2. ->get()
  3. ->reduceSpread(function (int $creditsRemaining, Collection $batch, Image $image) {
  4. if ($creditsRemaining >= $image->creditsRequired()) {
  5. $batch->push($image);
  6. $creditsRemaining -= $image->creditsRequired();
  7. }
  8. return [$creditsRemaining, $batch];
  9. }, $creditsAvailable, collect());

reject()

reject メソッドは、指定されたクロージャを使用してコレクションをフィルタリングします。クロージャは、アイテムが結果のコレクションから削除されるべき場合 true を返す必要があります:

  1. $collection = collect([1, 2, 3, 4]);
  2. $filtered = $collection->reject(function (int $value, int $key) {
  3. return $value > 2;
  4. });
  5. $filtered->all();
  6. // [1, 2]

reject メソッドの逆については、filter メソッドを参照してください。

replace()

replace メソッドは merge に似た動作をしますが、文字列キーを持つ一致するアイテムを上書きするだけでなく、replace メソッドは一致する数値キーを持つアイテムも上書きします:

  1. $collection = collect(['Taylor', 'Abigail', 'James']);
  2. $replaced = $collection->replace([1 => 'Victoria', 3 => 'Finn']);
  3. $replaced->all();
  4. // ['Taylor', 'Victoria', 'James', 'Finn']

replaceRecursive()

このメソッドは replace のように動作しますが、配列に再帰的に入り、内部の値に同じ置換プロセスを適用します:

  1. $collection = collect([
  2. 'Taylor',
  3. 'Abigail',
  4. [
  5. 'James',
  6. 'Victoria',
  7. 'Finn'
  8. ]
  9. ]);
  10. $replaced = $collection->replaceRecursive([
  11. 'Charlie',
  12. 2 => [1 => 'King']
  13. ]);
  14. $replaced->all();
  15. // ['Charlie', 'Abigail', ['James', 'King', 'Finn']]

reverse()

reverse メソッドは、コレクションのアイテムの順序を逆にし、元のキーを保持します:

  1. $collection = collect(['a', 'b', 'c', 'd', 'e']);
  2. $reversed = $collection->reverse();
  3. $reversed->all();
  4. /*
  5. [
  6. 4 => 'e',
  7. 3 => 'd',
  8. 2 => 'c',
  9. 1 => 'b',
  10. 0 => 'a',
  11. ]
  12. */

search()

search メソッドは、指定された値をコレクション内で検索し、見つかった場合はそのキーを返します。アイテムが見つからない場合、false が返されます:

  1. $collection = collect([2, 4, 6, 8]);
  2. $collection->search(4);
  3. // 1

検索は “緩やかな” 比較を使用して行われます。つまり、整数値を持つ文字列は、同じ値の整数と等しいと見なされます。”厳密な” 比較を使用するには、true をメソッドの 2 番目の引数として渡します:

  1. collect([2, 4, 6, 8])->search('4', strict: true);
  2. // false

または、指定された真実テストを通過する最初のアイテムを検索するために独自のクロージャを提供できます:

  1. collect([2, 4, 6, 8])->search(function (int $item, int $key) {
  2. return $item > 5;
  3. });
  4. // 2

select()

select メソッドは、コレクションから指定されたキーを選択します。これは、SQL SELECT ステートメントに似ています:

  1. $users = collect([
  2. ['name' => 'Taylor Otwell', 'role' => 'Developer', 'status' => 'active'],
  3. ['name' => 'Victoria Faith', 'role' => 'Researcher', 'status' => 'active'],
  4. ]);
  5. $users->select(['name', 'role']);
  6. /*
  7. [
  8. ['name' => 'Taylor Otwell', 'role' => 'Developer'],
  9. ['name' => 'Victoria Faith', 'role' => 'Researcher'],
  10. ],
  11. */

shift()

shift メソッドは、コレクションから最初のアイテムを削除して返します:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->shift();
  3. // 1
  4. $collection->all();
  5. // [2, 3, 4, 5]

shift メソッドに整数を渡すことで、コレクションの先頭から複数のアイテムを削除して返すことができます:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->shift(3);
  3. // collect([1, 2, 3])
  4. $collection->all();
  5. // [4, 5]

shuffle()

shuffle メソッドは、コレクション内のアイテムをランダムにシャッフルします:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $shuffled = $collection->shuffle();
  3. $shuffled->all();
  4. // [3, 2, 5, 1, 4] - (generated randomly)

skip()

skip メソッドは、新しいコレクションを返し、コレクションの先頭から指定された数の要素を削除します:

  1. $collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
  2. $collection = $collection->skip(4);
  3. $collection->all();
  4. // [5, 6, 7, 8, 9, 10]

skipUntil()

skipUntil メソッドは、指定されたコールバックが true を返すまでコレクションのアイテムをスキップし、その後、コレクション内の残りのアイテムを新しいコレクションインスタンスとして返します:

  1. $collection = collect([1, 2, 3, 4]);
  2. $subset = $collection->skipUntil(function (int $item) {
  3. return $item >= 3;
  4. });
  5. $subset->all();
  6. // [3, 4]

指定された値が見つかるまで、skipUntil メソッドに単純な値を渡してすべてのアイテムをスキップすることもできます:

  1. $collection = collect([1, 2, 3, 4]);
  2. $subset = $collection->skipUntil(3);
  3. $subset->all();
  4. // [3, 4]

指定された値が見つからない場合や、コールバックが true を返さない場合、skipUntil メソッドは空のコレクションを返します。

skipWhile()

skipWhile メソッドは、指定されたコールバックが true を返す間、コレクションのアイテムをスキップし、その後、コレクション内の残りのアイテムを新しいコレクションとして返します:

  1. $collection = collect([1, 2, 3, 4]);
  2. $subset = $collection->skipWhile(function (int $item) {
  3. return $item <= 3;
  4. });
  5. $subset->all();
  6. // [4]

コールバックが false を返さない場合、skipWhile メソッドは空のコレクションを返します。

slice()

slice メソッドは、指定されたインデックスからコレクションのスライスを返します:

  1. $collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
  2. $slice = $collection->slice(4);
  3. $slice->all();
  4. // [5, 6, 7, 8, 9, 10]

返されるスライスのサイズを制限したい場合は、メソッドの 2 番目の引数として希望のサイズを渡します:

  1. $slice = $collection->slice(4, 2);
  2. $slice->all();
  3. // [5, 6]

返されるスライスはデフォルトでキーを保持します。元のキーを保持したくない場合は、values メソッドを使用して再インデックス化できます。

sliding()

sliding メソッドは、コレクション内のアイテムの “スライディングウィンドウ” ビューを表す新しいコレクションのチャンクを返します:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $chunks = $collection->sliding(2);
  3. $chunks->toArray();
  4. // [[1, 2], [2, 3], [3, 4], [4, 5]]

これは、eachSpread メソッドと組み合わせて特に便利です:

  1. $transactions->sliding(2)->eachSpread(function (Collection $previous, Collection $current) {
  2. $current->total = $previous->total + $current->amount;
  3. });

オプションで、各チャンクの最初のアイテム間の距離を決定する 2 番目の “ステップ” 値を渡すことができます:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $chunks = $collection->sliding(3, step: 2);
  3. $chunks->toArray();
  4. // [[1, 2, 3], [3, 4, 5]]

sole()

sole メソッドは、指定された真理テストを通過するコレクション内の最初の要素を返しますが、真理テストが正確に 1 つの要素に一致する場合のみ返します:

  1. collect([1, 2, 3, 4])->sole(function (int $value, int $key) {
  2. return $value === 2;
  3. });
  4. // 2

sole メソッドにキー/値ペアを渡すこともでき、指定されたペアに一致するコレクション内の最初の要素を返しますが、正確に 1 つの要素が一致する場合のみ返します:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 100],
  4. ]);
  5. $collection->sole('product', 'Chair');
  6. // ['product' => 'Chair', 'price' => 100]

また、sole メソッドを引数なしで呼び出して、コレクションに要素が 1 つだけある場合に最初の要素を取得することもできます:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ]);
  4. $collection->sole();
  5. // ['product' => 'Desk', 'price' => 200]

sole メソッドによって返されるべき要素がコレクションに存在しない場合、\Illuminate\Collections\ItemNotFoundException 例外がスローされます。返されるべき要素が 1 つ以上ある場合、\Illuminate\Collections\MultipleItemsFoundException がスローされます。

some()

contains メソッドのエイリアスです。

sort()

sort メソッドはコレクションをソートします。ソートされたコレクションは元の配列キーを保持するため、次の例では values メソッドを使用してキーを連続番号のインデックスにリセットします:

  1. $collection = collect([5, 3, 1, 2, 4]);
  2. $sorted = $collection->sort();
  3. $sorted->values()->all();
  4. // [1, 2, 3, 4, 5]

ソートのニーズがより高度な場合は、sort にコールバックを渡して独自のアルゴリズムを使用できます。コレクションの sort メソッドが内部で利用する uasort に関する PHP ドキュメントを参照してください。

ネストされた配列やオブジェクトのコレクションをソートする必要がある場合は、sortBy および sortByDesc メソッドを参照してください。

sortBy()

sortBy メソッドは、指定されたキーでコレクションをソートします。ソートされたコレクションは元の配列キーを保持するため、次の例では values メソッドを使用してキーを連続番号のインデックスにリセットします:

  1. $collection = collect([
  2. ['name' => 'Desk', 'price' => 200],
  3. ['name' => 'Chair', 'price' => 100],
  4. ['name' => 'Bookcase', 'price' => 150],
  5. ]);
  6. $sorted = $collection->sortBy('price');
  7. $sorted->values()->all();
  8. /*
  9. [
  10. ['name' => 'Chair', 'price' => 100],
  11. ['name' => 'Bookcase', 'price' => 150],
  12. ['name' => 'Desk', 'price' => 200],
  13. ]
  14. */

sortBy メソッドは、2 番目の引数として ソートフラグ を受け入れます:

  1. $collection = collect([
  2. ['title' => 'Item 1'],
  3. ['title' => 'Item 12'],
  4. ['title' => 'Item 3'],
  5. ]);
  6. $sorted = $collection->sortBy('title', SORT_NATURAL);
  7. $sorted->values()->all();
  8. /*
  9. [
  10. ['title' => 'Item 1'],
  11. ['title' => 'Item 3'],
  12. ['title' => 'Item 12'],
  13. ]
  14. */

また、コレクションの値をソートする方法を決定するために独自のクロージャを渡すこともできます:

  1. $collection = collect([
  2. ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
  3. ['name' => 'Chair', 'colors' => ['Black']],
  4. ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
  5. ]);
  6. $sorted = $collection->sortBy(function (array $product, int $key) {
  7. return count($product['colors']);
  8. });
  9. $sorted->values()->all();
  10. /*
  11. [
  12. ['name' => 'Chair', 'colors' => ['Black']],
  13. ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
  14. ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
  15. ]
  16. */

複数の属性でコレクションをソートしたい場合は、sortBy メソッドにソート操作の配列を渡すことができます。各ソート操作は、ソートしたい属性と希望するソートの方向を含む配列である必要があります:

  1. $collection = collect([
  2. ['name' => 'Taylor Otwell', 'age' => 34],
  3. ['name' => 'Abigail Otwell', 'age' => 30],
  4. ['name' => 'Taylor Otwell', 'age' => 36],
  5. ['name' => 'Abigail Otwell', 'age' => 32],
  6. ]);
  7. $sorted = $collection->sortBy([
  8. ['name', 'asc'],
  9. ['age', 'desc'],
  10. ]);
  11. $sorted->values()->all();
  12. /*
  13. [
  14. ['name' => 'Abigail Otwell', 'age' => 32],
  15. ['name' => 'Abigail Otwell', 'age' => 30],
  16. ['name' => 'Taylor Otwell', 'age' => 36],
  17. ['name' => 'Taylor Otwell', 'age' => 34],
  18. ]
  19. */

複数の属性でコレクションをソートする場合、各ソート操作を定義するクロージャを提供することもできます:

  1. $collection = collect([
  2. ['name' => 'Taylor Otwell', 'age' => 34],
  3. ['name' => 'Abigail Otwell', 'age' => 30],
  4. ['name' => 'Taylor Otwell', 'age' => 36],
  5. ['name' => 'Abigail Otwell', 'age' => 32],
  6. ]);
  7. $sorted = $collection->sortBy([
  8. fn (array $a, array $b) => $a['name'] <=> $b['name'],
  9. fn (array $a, array $b) => $b['age'] <=> $a['age'],
  10. ]);
  11. $sorted->values()->all();
  12. /*
  13. [
  14. ['name' => 'Abigail Otwell', 'age' => 32],
  15. ['name' => 'Abigail Otwell', 'age' => 30],
  16. ['name' => 'Taylor Otwell', 'age' => 36],
  17. ['name' => 'Taylor Otwell', 'age' => 34],
  18. ]
  19. */

sortByDesc()

このメソッドは、sortBy メソッドと同じシグネチャを持ちますが、コレクションを逆の順序でソートします。

sortDesc()

このメソッドは、sort メソッドと同じように、コレクションを逆の順序でソートします:

  1. $collection = collect([5, 3, 1, 2, 4]);
  2. $sorted = $collection->sortDesc();
  3. $sorted->values()->all();
  4. // [5, 4, 3, 2, 1]

sort とは異なり、sortDesc にコールバックを渡すことはできません。代わりに、sort メソッドを使用して比較を反転させる必要があります。

sortKeys()

sortKeys メソッドは、基になる連想配列のキーでコレクションをソートします:

  1. $collection = collect([
  2. 'id' => 22345,
  3. 'first' => 'John',
  4. 'last' => 'Doe',
  5. ]);
  6. $sorted = $collection->sortKeys();
  7. $sorted->all();
  8. /*
  9. [
  10. 'first' => 'John',
  11. 'id' => 22345,
  12. 'last' => 'Doe',
  13. ]
  14. */

sortKeysDesc()

このメソッドは、sortKeys メソッドと同じシグネチャを持ちますが、コレクションを逆の順序でソートします。

sortKeysUsing()

sortKeysUsing メソッドは、コールバックを使用して基になる連想配列のキーでコレクションをソートします:

  1. $collection = collect([
  2. 'ID' => 22345,
  3. 'first' => 'John',
  4. 'last' => 'Doe',
  5. ]);
  6. $sorted = $collection->sortKeysUsing('strnatcasecmp');
  7. $sorted->all();
  8. /*
  9. [
  10. 'first' => 'John',
  11. 'ID' => 22345,
  12. 'last' => 'Doe',
  13. ]
  14. */

コールバックは、0 より小さい、等しい、または大きい整数を返す比較関数でなければなりません。詳細については、sortKeysUsing メソッドが内部で利用する PHP 関数に関する PHP ドキュメントを参照してください。uksort

splice()

splice メソッドは、指定されたインデックスからアイテムのスライスを削除して返します:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $chunk = $collection->splice(2);
  3. $chunk->all();
  4. // [3, 4, 5]
  5. $collection->all();
  6. // [1, 2]

結果のコレクションのサイズを制限するために、2 番目の引数を渡すことができます:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $chunk = $collection->splice(2, 1);
  3. $chunk->all();
  4. // [3]
  5. $collection->all();
  6. // [1, 2, 4, 5]

さらに、削除されたアイテムを置き換える新しいアイテムを含む 3 番目の引数を渡すこともできます:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $chunk = $collection->splice(2, 1, [10, 11]);
  3. $chunk->all();
  4. // [3]
  5. $collection->all();
  6. // [1, 2, 10, 11, 4, 5]

split()

split メソッドは、コレクションを指定された数のグループに分割します:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $groups = $collection->split(3);
  3. $groups->all();
  4. // [[1, 2], [3, 4], [5]]

splitIn()

splitIn メソッドは、コレクションを指定された数のグループに分割し、非端末グループを完全に埋めてから、残りを最終グループに割り当てます:

  1. $collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
  2. $groups = $collection->splitIn(3);
  3. $groups->all();
  4. // [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]

sum()

sum メソッドは、コレクション内のすべてのアイテムの合計を返します:

  1. collect([1, 2, 3, 4, 5])->sum();
  2. // 15

コレクションにネストされた配列やオブジェクトが含まれている場合、合計する値を決定するために使用されるキーを渡す必要があります:

  1. $collection = collect([
  2. ['name' => 'JavaScript: The Good Parts', 'pages' => 176],
  3. ['name' => 'JavaScript: The Definitive Guide', 'pages' => 1096],
  4. ]);
  5. $collection->sum('pages');
  6. // 1272

さらに、コレクションのどの値を合計するかを決定するために独自のクロージャを渡すこともできます:

  1. $collection = collect([
  2. ['name' => 'Chair', 'colors' => ['Black']],
  3. ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
  4. ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
  5. ]);
  6. $collection->sum(function (array $product) {
  7. return count($product['colors']);
  8. });
  9. // 6

take()

take メソッドは、指定された数のアイテムを持つ新しいコレクションを返します:

  1. $collection = collect([0, 1, 2, 3, 4, 5]);
  2. $chunk = $collection->take(3);
  3. $chunk->all();
  4. // [0, 1, 2]

コレクションの末尾から指定された数のアイテムを取得するために負の整数を渡すこともできます:

  1. $collection = collect([0, 1, 2, 3, 4, 5]);
  2. $chunk = $collection->take(-2);
  3. $chunk->all();
  4. // [4, 5]

takeUntil()

takeUntil メソッドは、指定されたコールバックが true を返すまでコレクション内のアイテムを返します:

  1. $collection = collect([1, 2, 3, 4]);
  2. $subset = $collection->takeUntil(function (int $item) {
  3. return $item >= 3;
  4. });
  5. $subset->all();
  6. // [1, 2]

指定された値が見つかるまで、takeUntil メソッドに単純な値を渡してアイテムを取得することもできます:

  1. $collection = collect([1, 2, 3, 4]);
  2. $subset = $collection->takeUntil(3);
  3. $subset->all();
  4. // [1, 2]

指定された値が見つからない場合や、コールバックが true を返さない場合、takeUntil メソッドはコレクション内のすべてのアイテムを返します。

takeWhile()

takeWhile メソッドは、指定されたコールバックが false を返すまでコレクション内のアイテムを返します:

  1. $collection = collect([1, 2, 3, 4]);
  2. $subset = $collection->takeWhile(function (int $item) {
  3. return $item < 3;
  4. });
  5. $subset->all();
  6. // [1, 2]

コールバックが false を返さない場合、takeWhile メソッドはコレクション内のすべてのアイテムを返します。

tap()

tap メソッドは、コレクションを指定されたコールバックに渡し、コレクション自体に影響を与えずに特定のポイントでコレクションに “タップ” してアイテムで何かを行うことを可能にします。コレクションは tap メソッドによって返されます:

  1. collect([2, 4, 3, 1, 5])
  2. ->sort()
  3. ->tap(function (Collection $collection) {
  4. Log::debug('Values after sorting', $collection->values()->all());
  5. })
  6. ->shift();
  7. // 1

times()

times 静的メソッドは、指定された回数だけ与えられたクロージャを呼び出して新しいコレクションを作成します:

  1. $collection = Collection::times(10, function (int $number) {
  2. return $number * 9;
  3. });
  4. $collection->all();
  5. // [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]

toArray()

toArray メソッドは、コレクションをプレーンな PHP array に変換します。コレクションの値が Eloquent モデルである場合、モデルも配列に変換されます:

  1. $collection = collect(['name' => 'Desk', 'price' => 200]);
  2. $collection->toArray();
  3. /*
  4. [
  5. ['name' => 'Desk', 'price' => 200],
  6. ]
  7. */

toArray は、Arrayable のインスタンスであるコレクションのすべてのネストされたオブジェクトを配列に変換します。コレクションの基になる生の配列を取得したい場合は、代わりに all メソッドを使用してください。

toJson()

toJson メソッドは、コレクションを JSON シリアライズされた文字列に変換します:

  1. $collection = collect(['name' => 'Desk', 'price' => 200]);
  2. $collection->toJson();
  3. // '{"name":"Desk", "price":200}'

transform()

transform メソッドは、コレクションを反復処理し、コレクション内の各アイテムで指定されたコールバックを呼び出します。コレクション内のアイテムは、コールバックによって返された値で置き換えられます:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->transform(function (int $item, int $key) {
  3. return $item * 2;
  4. });
  5. $collection->all();
  6. // [2, 4, 6, 8, 10]

他のほとんどのコレクションメソッドとは異なり、transform はコレクション自体を変更します。新しいコレクションを作成したい場合は、map メソッドを使用してください。

undot()

undot メソッドは、”ドット” 表記を使用する単一次元コレクションを多次元コレクションに展開します:

  1. $person = collect([
  2. 'name.first_name' => 'Marie',
  3. 'name.last_name' => 'Valentine',
  4. 'address.line_1' => '2992 Eagle Drive',
  5. 'address.line_2' => '',
  6. 'address.suburb' => 'Detroit',
  7. 'address.state' => 'MI',
  8. 'address.postcode' => '48219'
  9. ]);
  10. $person = $person->undot();
  11. $person->toArray();
  12. /*
  13. [
  14. "name" => [
  15. "first_name" => "Marie",
  16. "last_name" => "Valentine",
  17. ],
  18. "address" => [
  19. "line_1" => "2992 Eagle Drive",
  20. "line_2" => "",
  21. "suburb" => "Detroit",
  22. "state" => "MI",
  23. "postcode" => "48219",
  24. ],
  25. ]
  26. */

union()

union メソッドは、指定された配列をコレクションに追加します。指定された配列に元のコレクションに既に存在するキーが含まれている場合、元のコレクションの値が優先されます:

  1. $collection = collect([1 => ['a'], 2 => ['b']]);
  2. $union = $collection->union([3 => ['c'], 1 => ['d']]);
  3. $union->all();
  4. // [1 => ['a'], 2 => ['b'], 3 => ['c']]

unique()

unique メソッドは、コレクション内のすべてのユニークなアイテムを返します。返されるコレクションは元の配列キーを保持するため、次の例では values メソッドを使用してキーを連続番号のインデックスにリセットします:

  1. $collection = collect([1, 1, 2, 2, 3, 4, 2]);
  2. $unique = $collection->unique();
  3. $unique->values()->all();
  4. // [1, 2, 3, 4]

ネストされた配列やオブジェクトを扱う場合、ユニーク性を決定するために使用されるキーを指定できます:

  1. $collection = collect([
  2. ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
  3. ['name' => 'iPhone 5', 'brand' => 'Apple', 'type' => 'phone'],
  4. ['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
  5. ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
  6. ['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
  7. ]);
  8. $unique = $collection->unique('brand');
  9. $unique->values()->all();
  10. /*
  11. [
  12. ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
  13. ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
  14. ]
  15. */

最後に、unique メソッドに独自のクロージャを渡して、アイテムのユニーク性を決定する値を指定することもできます:

  1. $unique = $collection->unique(function (array $item) {
  2. return $item['brand'].$item['type'];
  3. });
  4. $unique->values()->all();
  5. /*
  6. [
  7. ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
  8. ['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
  9. ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
  10. ['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
  11. ]
  12. */

unique メソッドは、アイテムの値をチェックする際に “緩やかな” 比較を使用します。つまり、整数値を持つ文字列は、同じ値の整数と等しいと見なされます。uniqueStrict メソッドを使用して、”厳密な” 比較を使用してフィルタリングします。

このメソッドの動作は、Eloquent Collections を使用する際に変更されます。

uniqueStrict()

このメソッドは、unique メソッドと同じシグネチャを持ちますが、すべての値は “厳密な” 比較を使用して比較されます。

unless()

unless メソッドは、メソッドに渡された最初の引数が true に評価されない限り、指定されたコールバックを実行します:

  1. $collection = collect([1, 2, 3]);
  2. $collection->unless(true, function (Collection $collection) {
  3. return $collection->push(4);
  4. });
  5. $collection->unless(false, function (Collection $collection) {
  6. return $collection->push(5);
  7. });
  8. $collection->all();
  9. // [1, 2, 3, 5]

unless メソッドに 2 番目のコールバックを渡すことができます。最初の引数が true に評価されると、2 番目のコールバックが実行されます:

  1. $collection = collect([1, 2, 3]);
  2. $collection->unless(true, function (Collection $collection) {
  3. return $collection->push(4);
  4. }, function (Collection $collection) {
  5. return $collection->push(5);
  6. });
  7. $collection->all();
  8. // [1, 2, 3, 5]

unless の逆については、when メソッドを参照してください。

unlessEmpty()

whenNotEmpty メソッドのエイリアスです。

unlessNotEmpty()

whenEmpty メソッドのエイリアスです。

unwrap()

unwrap 静的メソッドは、適用可能な場合に指定された値からコレクションの基になるアイテムを返します:

  1. Collection::unwrap(collect('John Doe'));
  2. // ['John Doe']
  3. Collection::unwrap(['John Doe']);
  4. // ['John Doe']
  5. Collection::unwrap('John Doe');
  6. // 'John Doe'

value()

value メソッドは、コレクションの最初の要素から指定された値を取得します:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Speaker', 'price' => 400],
  4. ]);
  5. $value = $collection->value('price');
  6. // 200

values()

values メソッドは、キーを連続整数にリセットした新しいコレクションを返します:

  1. $collection = collect([
  2. 10 => ['product' => 'Desk', 'price' => 200],
  3. 11 => ['product' => 'Desk', 'price' => 200],
  4. ]);
  5. $values = $collection->values();
  6. $values->all();
  7. /*
  8. [
  9. 0 => ['product' => 'Desk', 'price' => 200],
  10. 1 => ['product' => 'Desk', 'price' => 200],
  11. ]
  12. */

when()

when メソッドは、メソッドに渡された最初の引数が true に評価されると、指定されたコールバックを実行します。コレクションインスタンスと when メソッドに渡された最初の引数がクロージャに提供されます:

  1. $collection = collect([1, 2, 3]);
  2. $collection->when(true, function (Collection $collection, int $value) {
  3. return $collection->push(4);
  4. });
  5. $collection->when(false, function (Collection $collection, int $value) {
  6. return $collection->push(5);
  7. });
  8. $collection->all();
  9. // [1, 2, 3, 4]

when メソッドに 2 番目のコールバックを渡すことができます。最初の引数が false に評価されると、2 番目のコールバックが実行されます:

  1. $collection = collect([1, 2, 3]);
  2. $collection->when(false, function (Collection $collection, int $value) {
  3. return $collection->push(4);
  4. }, function (Collection $collection) {
  5. return $collection->push(5);
  6. });
  7. $collection->all();
  8. // [1, 2, 3, 5]

when の逆については、unless メソッドを参照してください。

whenEmpty()

whenEmpty メソッドは、コレクションが空のときに指定されたコールバックを実行します:

  1. $collection = collect(['Michael', 'Tom']);
  2. $collection->whenEmpty(function (Collection $collection) {
  3. return $collection->push('Adam');
  4. });
  5. $collection->all();
  6. // ['Michael', 'Tom']
  7. $collection = collect();
  8. $collection->whenEmpty(function (Collection $collection) {
  9. return $collection->push('Adam');
  10. });
  11. $collection->all();
  12. // ['Adam']

コレクションが空でないときに実行される 2 番目のクロージャを whenEmpty メソッドに渡すことができます:

  1. $collection = collect(['Michael', 'Tom']);
  2. $collection->whenEmpty(function (Collection $collection) {
  3. return $collection->push('Adam');
  4. }, function (Collection $collection) {
  5. return $collection->push('Taylor');
  6. });
  7. $collection->all();
  8. // ['Michael', 'Tom', 'Taylor']

whenEmpty の逆については、whenNotEmpty メソッドを参照してください。

whenNotEmpty()

whenNotEmpty メソッドは、コレクションが空でないときに指定されたコールバックを実行します:

  1. $collection = collect(['michael', 'tom']);
  2. $collection->whenNotEmpty(function (Collection $collection) {
  3. return $collection->push('adam');
  4. });
  5. $collection->all();
  6. // ['michael', 'tom', 'adam']
  7. $collection = collect();
  8. $collection->whenNotEmpty(function (Collection $collection) {
  9. return $collection->push('adam');
  10. });
  11. $collection->all();
  12. // []

コレクションが空のときに実行される 2 番目のクロージャを whenNotEmpty メソッドに渡すことができます:

  1. $collection = collect();
  2. $collection->whenNotEmpty(function (Collection $collection) {
  3. return $collection->push('adam');
  4. }, function (Collection $collection) {
  5. return $collection->push('taylor');
  6. });
  7. $collection->all();
  8. // ['taylor']

whenNotEmpty の逆については、whenEmpty メソッドを参照してください。

where()

where メソッドは、指定されたキー/値ペアによってコレクションをフィルタリングします:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 100],
  4. ['product' => 'Bookcase', 'price' => 150],
  5. ['product' => 'Door', 'price' => 100],
  6. ]);
  7. $filtered = $collection->where('price', 100);
  8. $filtered->all();
  9. /*
  10. [
  11. ['product' => 'Chair', 'price' => 100],
  12. ['product' => 'Door', 'price' => 100],
  13. ]
  14. */

where メソッドは、アイテムの値をチェックする際に「緩やかな」比較を使用します。つまり、整数値を持つ文字列は、同じ値の整数と等しいと見なされます。厳密な比較を使用してフィルタリングするには、whereStrict メソッドを使用してください。

オプションで、2番目のパラメータとして比較演算子を渡すことができます。サポートされている演算子は: ‘===’, ‘!==’, ‘!=’, ‘==’, ‘=’, ‘<>’, ‘>’, ‘<’, ‘>=’, および ‘<=’:

  1. $collection = collect([
  2. ['name' => 'Jim', 'deleted_at' => '2019-01-01 00:00:00'],
  3. ['name' => 'Sally', 'deleted_at' => '2019-01-02 00:00:00'],
  4. ['name' => 'Sue', 'deleted_at' => null],
  5. ]);
  6. $filtered = $collection->where('deleted_at', '!=', null);
  7. $filtered->all();
  8. /*
  9. [
  10. ['name' => 'Jim', 'deleted_at' => '2019-01-01 00:00:00'],
  11. ['name' => 'Sally', 'deleted_at' => '2019-01-02 00:00:00'],
  12. ]
  13. */

whereStrict()

このメソッドは、where メソッドと同じシグネチャを持っています。ただし、すべての値は「厳密な」比較を使用して比較されます。

whereBetween()

whereBetween メソッドは、指定されたアイテムの値が与えられた範囲内にあるかどうかを判断することによってコレクションをフィルタリングします:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 80],
  4. ['product' => 'Bookcase', 'price' => 150],
  5. ['product' => 'Pencil', 'price' => 30],
  6. ['product' => 'Door', 'price' => 100],
  7. ]);
  8. $filtered = $collection->whereBetween('price', [100, 200]);
  9. $filtered->all();
  10. /*
  11. [
  12. ['product' => 'Desk', 'price' => 200],
  13. ['product' => 'Bookcase', 'price' => 150],
  14. ['product' => 'Door', 'price' => 100],
  15. ]
  16. */

whereIn()

whereIn メソッドは、指定されたアイテムの値が与えられた配列に含まれていない要素をコレクションから削除します:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 100],
  4. ['product' => 'Bookcase', 'price' => 150],
  5. ['product' => 'Door', 'price' => 100],
  6. ]);
  7. $filtered = $collection->whereIn('price', [150, 200]);
  8. $filtered->all();
  9. /*
  10. [
  11. ['product' => 'Desk', 'price' => 200],
  12. ['product' => 'Bookcase', 'price' => 150],
  13. ]
  14. */

whereIn メソッドは、アイテムの値をチェックする際に「緩やかな」比較を使用します。つまり、整数値を持つ文字列は、同じ値の整数と等しいと見なされます。厳密な比較を使用してフィルタリングするには、whereInStrict メソッドを使用してください。

whereInStrict()

このメソッドは、whereIn メソッドと同じシグネチャを持っています。ただし、すべての値は「厳密な」比較を使用して比較されます。

whereInstanceOf()

whereInstanceOf メソッドは、指定されたクラス型によってコレクションをフィルタリングします:

  1. use App\Models\User;
  2. use App\Models\Post;
  3. $collection = collect([
  4. new User,
  5. new User,
  6. new Post,
  7. ]);
  8. $filtered = $collection->whereInstanceOf(User::class);
  9. $filtered->all();
  10. // [App\Models\User, App\Models\User]

whereNotBetween()

whereNotBetween メソッドは、指定されたアイテムの値が与えられた範囲外にあるかどうかを判断することによってコレクションをフィルタリングします:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 80],
  4. ['product' => 'Bookcase', 'price' => 150],
  5. ['product' => 'Pencil', 'price' => 30],
  6. ['product' => 'Door', 'price' => 100],
  7. ]);
  8. $filtered = $collection->whereNotBetween('price', [100, 200]);
  9. $filtered->all();
  10. /*
  11. [
  12. ['product' => 'Chair', 'price' => 80],
  13. ['product' => 'Pencil', 'price' => 30],
  14. ]
  15. */

whereNotIn()

whereNotIn メソッドは、指定されたアイテムの値が与えられた配列に含まれている要素をコレクションから削除します:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 100],
  4. ['product' => 'Bookcase', 'price' => 150],
  5. ['product' => 'Door', 'price' => 100],
  6. ]);
  7. $filtered = $collection->whereNotIn('price', [150, 200]);
  8. $filtered->all();
  9. /*
  10. [
  11. ['product' => 'Chair', 'price' => 100],
  12. ['product' => 'Door', 'price' => 100],
  13. ]
  14. */

whereNotIn メソッドは、アイテムの値をチェックする際に「緩やかな」比較を使用します。つまり、整数値を持つ文字列は、同じ値の整数と等しいと見なされます。厳密な比較を使用してフィルタリングするには、whereNotInStrict メソッドを使用してください。

whereNotInStrict()

このメソッドは、whereNotIn メソッドと同じシグネチャを持っています。ただし、すべての値は「厳密な」比較を使用して比較されます。

whereNotNull()

whereNotNull メソッドは、指定されたキーが null でないコレクションのアイテムを返します:

  1. $collection = collect([
  2. ['name' => 'Desk'],
  3. ['name' => null],
  4. ['name' => 'Bookcase'],
  5. ]);
  6. $filtered = $collection->whereNotNull('name');
  7. $filtered->all();
  8. /*
  9. [
  10. ['name' => 'Desk'],
  11. ['name' => 'Bookcase'],
  12. ]
  13. */

whereNull()

whereNull メソッドは、指定されたキーが null であるコレクションのアイテムを返します:

  1. $collection = collect([
  2. ['name' => 'Desk'],
  3. ['name' => null],
  4. ['name' => 'Bookcase'],
  5. ]);
  6. $filtered = $collection->whereNull('name');
  7. $filtered->all();
  8. /*
  9. [
  10. ['name' => null],
  11. ]
  12. */

wrap()

静的な wrap メソッドは、適用可能な場合に指定された値をコレクションにラップします:

  1. use Illuminate\Support\Collection;
  2. $collection = Collection::wrap('John Doe');
  3. $collection->all();
  4. // ['John Doe']
  5. $collection = Collection::wrap(['John Doe']);
  6. $collection->all();
  7. // ['John Doe']
  8. $collection = Collection::wrap(collect('John Doe'));
  9. $collection->all();
  10. // ['John Doe']

zip()

zip メソッドは、与えられた配列の値を元のコレクションの対応するインデックスの値とマージします:

  1. $collection = collect(['Chair', 'Desk']);
  2. $zipped = $collection->zip([100, 200]);
  3. $zipped->all();
  4. // [['Chair', 100], ['Desk', 200]]

Higher Order Messages

コレクションは「高次メッセージ」をサポートしており、コレクションに対して一般的なアクションを実行するためのショートカットです。高次メッセージを提供するコレクションメソッドは: average, avg, contains, each, every, filter, first, flatMap, groupBy, keyBy, map, max, min, partition, reject, skipUntil, skipWhile, some, sortBy, sortByDesc, sum, takeUntil, takeWhile, および unique.

各高次メッセージは、コレクションインスタンスの動的プロパティとしてアクセスできます。たとえば、each 高次メッセージを使用して、コレクション内の各オブジェクトにメソッドを呼び出すことができます:

  1. use App\Models\User;
  2. $users = User::where('votes', '>', 500)->get();
  3. $users->each->markAsVip();

同様に、sum 高次メッセージを使用して、ユーザーのコレクションの「投票」の合計数を集計できます:

  1. $users = User::where('group', 'Development')->get();
  2. return $users->sum->votes;

Lazy Collections

Introduction

Laravel のレイジーコレクションについてさらに学ぶ前に、PHP ジェネレーターに慣れるための時間を取ってください。

すでに強力な Collection クラスを補完するために、LazyCollection クラスは PHP の ジェネレーター を活用して、メモリ使用量を低く抑えながら非常に大きなデータセットで作業できるようにします。

たとえば、アプリケーションが Laravel のコレクションメソッドを利用してログを解析しながら、マルチギガバイトのログファイルを処理する必要があると想像してください。一度にファイル全体をメモリに読み込むのではなく、レイジーコレクションを使用して、特定の時点でファイルの小さな部分だけをメモリに保持することができます:

  1. use App\Models\LogEntry;
  2. use Illuminate\Support\LazyCollection;
  3. LazyCollection::make(function () {
  4. $handle = fopen('log.txt', 'r');
  5. while (($line = fgets($handle)) !== false) {
  6. yield $line;
  7. }
  8. })->chunk(4)->map(function (array $lines) {
  9. return LogEntry::fromLines($lines);
  10. })->each(function (LogEntry $logEntry) {
  11. // Process the log entry...
  12. });

または、10,000 の Eloquent モデルを反復処理する必要があると想像してください。従来の Laravel コレクションを使用すると、すべての 10,000 の Eloquent モデルを同時にメモリに読み込む必要があります:

  1. use App\Models\User;
  2. $users = User::all()->filter(function (User $user) {
  3. return $user->id > 500;
  4. });

ただし、クエリビルダーの cursor メソッドは LazyCollection インスタンスを返します。これにより、データベースに対して単一のクエリを実行しながら、同時にメモリに読み込まれる Eloquent モデルを 1 つだけ保持することができます。この例では、filter コールバックは、実際に各ユーザーを個別に反復処理するまで実行されず、メモリ使用量が大幅に削減されます:

  1. use App\Models\User;
  2. $users = User::cursor()->filter(function (User $user) {
  3. return $user->id > 500;
  4. });
  5. foreach ($users as $user) {
  6. echo $user->id;
  7. }

Creating Lazy Collections

レイジーコレクションインスタンスを作成するには、PHP ジェネレーター関数をコレクションの make メソッドに渡す必要があります:

  1. use Illuminate\Support\LazyCollection;
  2. LazyCollection::make(function () {
  3. $handle = fopen('log.txt', 'r');
  4. while (($line = fgets($handle)) !== false) {
  5. yield $line;
  6. }
  7. });

The Enumerable Contract

Collection クラスで利用可能なほぼすべてのメソッドは、LazyCollection クラスでも利用可能です。これらのクラスは、次のメソッドを定義する Illuminate\Support\Enumerable コントラクトを実装しています:

all average avg chunk chunkWhile collapse collect combine concat contains containsStrict count countBy crossJoin dd diff diffAssoc diffKeys dump duplicates duplicatesStrict each eachSpread every except filter first firstOrFail firstWhere flatMap flatten flip forPage get groupBy has implode intersect intersectAssoc intersectByKeys isEmpty isNotEmpty join keyBy keys last macro make map mapInto mapSpread mapToGroups mapWithKeys max median merge mergeRecursive min mode nth only pad partition pipe pluck random reduce reject replace replaceRecursive reverse search shuffle skip slice sole some sort sortBy sortByDesc sortKeys sortKeysDesc split sum take tap times toArray toJson union unique uniqueStrict unless unlessEmpty unlessNotEmpty unwrap values when whenEmpty whenNotEmpty where whereStrict whereBetween whereIn whereInStrict whereInstanceOf whereNotBetween whereNotIn whereNotInStrict wrap zip

コレクションを変更するメソッド(shift, pop, prepend など)は、LazyCollection クラスでは 利用できません

Lazy Collection Methods

Enumerable コントラクトで定義されたメソッドに加えて、LazyCollection クラスには次のメソッドが含まれています:

takeUntilTimeout()

takeUntilTimeout メソッドは、指定された時間まで値を列挙する新しいレイジーコレクションを返します。その時間が過ぎると、コレクションは列挙を停止します:

  1. $lazyCollection = LazyCollection::times(INF)
  2. ->takeUntilTimeout(now()->addMinute());
  3. $lazyCollection->each(function (int $number) {
  4. dump($number);
  5. sleep(1);
  6. });
  7. // 1
  8. // 2
  9. // ...
  10. // 58
  11. // 59

このメソッドの使用例を示すために、カーソルを使用してデータベースから請求書を送信するアプリケーションを想像してください。15 分ごとに実行され、最大 14 分間のみ請求書を処理する スケジュールされたタスク を定義できます:

  1. use App\Models\Invoice;
  2. use Illuminate\Support\Carbon;
  3. Invoice::pending()->cursor()
  4. ->takeUntilTimeout(
  5. Carbon::createFromTimestamp(LARAVEL_START)->add(14, 'minutes')
  6. )
  7. ->each(fn (Invoice $invoice) => $invoice->submit());

tapEach()

each メソッドは、コレクション内の各アイテムに対してすぐに指定されたコールバックを呼び出しますが、tapEach メソッドは、アイテムがリストから 1 つずつ取り出されるときにのみ指定されたコールバックを呼び出します:

  1. // Nothing has been dumped so far...
  2. $lazyCollection = LazyCollection::times(INF)->tapEach(function (int $value) {
  3. dump($value);
  4. });
  5. // Three items are dumped...
  6. $array = $lazyCollection->take(3)->all();
  7. // 1
  8. // 2
  9. // 3

throttle()

throttle メソッドは、レイジーコレクションをスロットルし、指定された秒数後に各値を返します。このメソッドは、外部 API とやり取りする場合に特に便利です。これにより、受信リクエストのレート制限が行われます:

  1. use App\Models\User;
  2. User::where('vip', true)
  3. ->cursor()
  4. ->throttle(seconds: 1)
  5. ->each(function (User $user) {
  6. // Call external API...
  7. });

remember()

remember メソッドは、すでに列挙された値を記憶し、次回のコレクション列挙時に再取得しない新しいレイジーコレクションを返します:

  1. // No query has been executed yet...
  2. $users = User::cursor()->remember();
  3. // The query is executed...
  4. // The first 5 users are hydrated from the database...
  5. $users->take(5)->all();
  6. // First 5 users come from the collection's cache...
  7. // The rest are hydrated from the database...
  8. $users->take(20)->all();