コレクション
イントロダクション
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クラスに追加します。
1use Illuminate\Support\Collection; 2use Illuminate\Support\Str; 3 4Collection::macro('toUpper', function () { 5 return $this->map(function (string $value) { 6 return Str::upper($value); 7 }); 8}); 9 10$collection = collect(['first', 'second']);11 12$upper = $collection->toUpper();13 14// ['FIRST', 'SECOND']
通常、コレクションマクロはサービスプロバイダのbootメソッドで宣言する必要があります。
マクロの引数
必要に応じて、追加の引数を取るマクロを定義できます。
1use Illuminate\Support\Collection; 2use Illuminate\Support\Facades\Lang; 3 4Collection::macro('toLocale', function (string $locale) { 5 return $this->map(function (string $value) use ($locale) { 6 return Lang::get($value, [], $locale); 7 }); 8}); 9 10$collection = collect(['first', 'second']);11 12$translated = $collection->toLocale('es');
利用可能なメソッド
このコレクションのドキュメントの残りの大部分では、Collectionクラスで利用可能な各メソッドについて説明します。これらのメソッドはすべてチェーンして、基になる配列を流暢に操作できることを忘れないでください。さらに、ほとんどすべてのメソッドが新しいCollectionインスタンスを返すため、必要に応じてコレクションの元のコピーを保持できます。
after all average avg before chunk chunkWhile collapse collapseWithKeys 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 intersectUsing intersectAssoc intersectAssocUsing 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 3$collection->after(3);4 5// 46 7$collection->after(5);8 9// null
このメソッドは、「緩やかな」比較を使用して、指定されたアイテムを検索します。つまり、整数値を含む文字列は、同じ値の整数と等しいと見なされます。「厳密な」比較を使用するには、メソッドにstrict引数を指定します。
1collect([2, 4, 6, 8])->after('4', strict: true);2 3// null
代わりに、独自のクロージャを指定して、特定の真理値テストに合格する最初のアイテムを検索することもできます。
1collect([2, 4, 6, 8])->after(function (int $item, int $key) {2 return $item > 5;3});4 5// 8
all()
allメソッドは、コレクションが表す、そのコレクションの元になっている配列を返します。
1collect([1, 2, 3])->all();2 3// [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 8// 20 9 10$average = collect([1, 1, 2, 4])->avg();11 12// 2
before()
beforeメソッドはafterメソッドの逆です。指定したアイテムの前のアイテムを返します。指定したアイテムが見つからない場合、または最初のアイテムである場合は、nullが返されます。
1$collection = collect([1, 2, 3, 4, 5]); 2 3$collection->before(3); 4 5// 2 6 7$collection->before(1); 8 9// null10 11collect([2, 4, 6, 8])->before('4', strict: true);12 13// null14 15collect([2, 4, 6, 8])->before(function (int $item, int $key) {16 return $item > 5;17});18 19// 4
chunk()
chunkメソッドは、コレクションを指定したサイズの複数の小さなコレクションに分割します。
1$collection = collect([1, 2, 3, 4, 5, 6, 7]);2 3$chunks = $collection->chunk(4);4 5$chunks->all();6 7// [[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 @endforeach6 </div>7@endforeach
chunkWhile()
chunkWhileメソッドは、指定したコールバックの評価に基づいて、コレクションを複数の小さなコレクションに分割します。クロージャに渡される$chunk変数は、前の要素を調べるために使用できます。
1$collection = collect(str_split('AABBCCCD'));2 3$chunks = $collection->chunkWhile(function (string $value, int $key, Collection $chunk) {4 return $value === $chunk->last();5});6 7$chunks->all();8 9// [['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 7$collapsed = $collection->collapse(); 8 9$collapsed->all();10 11// [1, 2, 3, 4, 5, 6, 7, 8, 9]
collapseWithKeys()
collapseWithKeysメソッドは、配列またはコレクションのコレクションを、元のキーを維持したまま、単一のコレクションへフラット化します。
1$collection = collect([ 2 ['first' => collect([1, 2, 3])], 3 ['second' => [4, 5, 6]], 4 ['third' => collect([7, 8, 9])] 5]); 6 7$collapsed = $collection->collapseWithKeys(); 8 9$collapsed->all();10 11// [12// 'first' => [1, 2, 3],13// 'second' => [4, 5, 6],14// 'third' => [7, 8, 9],15// ]
collect()
collectメソッドは、現在コレクションにあるアイテムを持つ、新しいCollectionインスタンスを返します。
1$collectionA = collect([1, 2, 3]);2 3$collectionB = $collectionA->collect();4 5$collectionB->all();6 7// [1, 2, 3]
collectメソッドは、主に遅延コレクションを標準のCollectionインスタンスに変換するのに役立ちます。
1$lazyCollection = LazyCollection::make(function () { 2 yield 1; 3 yield 2; 4 yield 3; 5}); 6 7$collection = $lazyCollection->collect(); 8 9$collection::class;10 11// 'Illuminate\Support\Collection'12 13$collection->all();14 15// [1, 2, 3]
collectメソッドは、Enumerableのインスタンスを持っており、遅延しないコレクションインスタンスが必要な場合に特に役立ちます。collect()はEnumerable契約の一部であるため、安全に使用してCollectionインスタンスを取得できます。
combine()
combineメソッドは、コレクションの値をキーとして、別の配列またはコレクションの値と結合します。
1$collection = collect(['name', 'age']);2 3$combined = $collection->combine(['George', 29]);4 5$combined->all();6 7// ['name' => 'George', 'age' => 29]
concat()
concatメソッドは、指定したarrayまたはコレクションの値を別のコレクションの末尾に追加します。
1$collection = collect(['John Doe']);2 3$concatenated = $collection->concat(['Jane Doe'])->concat(['name' => 'Johnny Doe']);4 5$concatenated->all();6 7// ['John Doe', 'Jane Doe', 'Johnny Doe']
concatメソッドは、元のコレクションに連結されたアイテムのキーを数値で再インデックスします。連想コレクションのキーを維持するには、mergeメソッドを参照してください。
contains()
containsメソッドは、コレクションに特定のアイテムが含まれているかどうかを判断します。特定の真理値テストに一致する要素がコレクションに存在するかどうかを判断するために、containsメソッドにクロージャを渡すことができます。
1$collection = collect([1, 2, 3, 4, 5]);2 3$collection->contains(function (int $value, int $key) {4 return $value > 5;5});6 7// false
または、containsメソッドに文字列を渡して、コレクションに特定のアイテム値が含まれているかどうかを判断することもできます。
1$collection = collect(['name' => 'Desk', 'price' => 100]);2 3$collection->contains('Desk');4 5// true6 7$collection->contains('New York');8 9// false
containsメソッドにキー/値のペアを渡すこともできます。これにより、指定したペアがコレクションに存在するかどうかが判断されます。
1$collection = collect([2 ['product' => 'Desk', 'price' => 200],3 ['product' => 'Chair', 'price' => 100],4]);5 6$collection->contains('product', 'Bookcase');7 8// false
containsメソッドは、アイテムの値をチェックするときに「緩やかな」比較を使用します。つまり、整数値を持つ文字列は、同じ値の整数と等しいと見なされます。「厳密な」比較を使用してフィルタリングするには、containsStrictメソッドを使用してください。
containsの逆については、doesntContainメソッドを参照してください。
containsOneItem()
containsOneItemメソッドは、コレクションにアイテムが1つだけ含まれているかどうかを判別します。
1collect([])->containsOneItem(); 2 3// false 4 5collect(['1'])->containsOneItem(); 6 7// true 8 9collect(['1', '2'])->containsOneItem();10 11// false
containsStrict()
このメソッドはcontainsメソッドと同じシグネチャを持っています。ただし、すべての値は「厳密な」比較を使用して比較されます。
このメソッドの動作は、Eloquentコレクションを使用する場合に変更されます。
count()
countメソッドは、コレクション内のアイテムの総数を返します。
1$collection = collect([1, 2, 3, 4]);2 3$collection->count();4 5// 4
countBy()
countByメソッドは、コレクション内の値の出現回数をカウントします。デフォルトでは、メソッドはすべての要素の出現回数をカウントするため、コレクション内の特定の「タイプ」の要素をカウントできます。
1$collection = collect([1, 2, 2, 2, 3]);2 3$counted = $collection->countBy();4 5$counted->all();6 7// [1 => 1, 2 => 3, 3 => 1]
countByメソッドにクロージャを渡して、カスタム値ですべてのアイテムをカウントできます。
2 3$counted = $collection->countBy(function (string $email) {4 return substr(strrchr($email, "@"), 1);5});6 7$counted->all();8 9// ['gmail.com' => 2, 'yahoo.com' => 1]
crossJoin()
crossJoinメソッドは、コレクションの値を指定した配列またはコレクション間でクロス結合し、すべての可能な順列を持つデカルト積を返します。
1$collection = collect([1, 2]); 2 3$matrix = $collection->crossJoin(['a', 'b']); 4 5$matrix->all(); 6 7/* 8 [ 9 [1, 'a'],10 [1, 'b'],11 [2, 'a'],12 [2, 'b'],13 ]14*/15 16$collection = collect([1, 2]);17 18$matrix = $collection->crossJoin(['a', 'b'], ['I', 'II']);19 20$matrix->all();21 22/*23 [24 [1, 'a', 'I'],25 [1, 'a', 'II'],26 [1, 'b', 'I'],27 [1, 'b', 'II'],28 [2, 'a', 'I'],29 [2, 'a', 'II'],30 [2, 'b', 'I'],31 [2, 'b', 'II'],32 ]33*/
dd()
ddメソッドは、コレクションのアイテムをダンプし、スクリプトの実行を終了します。
1$collection = collect(['John Doe', 'Jane Doe']); 2 3$collection->dd(); 4 5/* 6 Collection { 7 #items: array:2 [ 8 0 => "John Doe" 9 1 => "Jane Doe"10 ]11 }12*/
スクリプトの実行を停止したくない場合は、代わりにdumpメソッドを使用してください。
diff()
diffメソッドは、コレクションをその値に基づいて別のコレクションまたはプレーンなPHParrayと比較します。このメソッドは、指定したコレクションに存在しない、元のコレクションの値を返します。
1$collection = collect([1, 2, 3, 4, 5]);2 3$diff = $collection->diff([2, 4, 6, 8]);4 5$diff->all();6 7// [1, 3, 5]
このメソッドの動作は、Eloquentコレクションを使用する場合に変更されます。
diffAssoc()
diffAssocメソッドは、コレクションをそのキーと値に基づいて別のコレクションまたはプレーンなPHParrayと比較します。このメソッドは、指定したコレクションに存在しない、元のコレクションのキー/値ペアを返します。
1$collection = collect([ 2 'color' => 'orange', 3 'type' => 'fruit', 4 'remain' => 6, 5]); 6 7$diff = $collection->diffAssoc([ 8 'color' => 'yellow', 9 'type' => 'fruit',10 'remain' => 3,11 'used' => 6,12]);13 14$diff->all();15 16// ['color' => 'orange', 'remain' => 6]
diffAssocUsing()
diffAssocとは異なり、diffAssocUsingは、インデックスの比較のためにユーザーが指定したコールバック関数を引数に取ります。
1$collection = collect([ 2 'color' => 'orange', 3 'type' => 'fruit', 4 'remain' => 6, 5]); 6 7$diff = $collection->diffAssocUsing([ 8 'Color' => 'yellow', 9 'Type' => 'fruit',10 'Remain' => 3,11], 'strnatcasecmp');12 13$diff->all();14 15// ['color' => 'orange', 'remain' => 6]
コールバックは、ゼロより小さい、等しい、または大きい整数を返す比較関数でなければなりません。詳細については、diffAssocUsingメソッドが内部で利用するPHP関数であるarray_diff_uassocに関するPHPドキュメントを参照してください。
diffKeys()
diffKeysメソッドは、コレクションをそのキーに基づいて別のコレクションまたはプレーンなPHParrayと比較します。このメソッドは、指定したコレクションに存在しない、元のコレクションのキー/値ペアを返します。
1$collection = collect([ 2 'one' => 10, 3 'two' => 20, 4 'three' => 30, 5 'four' => 40, 6 'five' => 50, 7]); 8 9$diff = $collection->diffKeys([10 'two' => 2,11 'four' => 4,12 'six' => 6,13 'eight' => 8,14]);15 16$diff->all();17 18// ['one' => 10, 'three' => 30, 'five' => 50]
doesntContain()
doesntContainメソッドは、コレクションに特定のアイテムが含まれていないかどうかを判断します。特定の真理値テストに一致する要素がコレクションに存在しないかどうかを判断するために、doesntContainメソッドにクロージャを渡すことができます。
1$collection = collect([1, 2, 3, 4, 5]);2 3$collection->doesntContain(function (int $value, int $key) {4 return $value < 5;5});6 7// false
または、doesntContainメソッドに文字列を渡して、コレクションに特定のアイテム値が含まれていないかどうかを判断することもできます。
1$collection = collect(['name' => 'Desk', 'price' => 100]);2 3$collection->doesntContain('Table');4 5// true6 7$collection->doesntContain('Desk');8 9// false
doesntContainメソッドにキー/値のペアを渡すこともできます。これにより、指定したペアがコレクションに存在しないかどうかが判断されます。
1$collection = collect([2 ['product' => 'Desk', 'price' => 200],3 ['product' => 'Chair', 'price' => 100],4]);5 6$collection->doesntContain('product', 'Bookcase');7 8// true
doesntContainメソッドは、アイテムの値をチェックするときに「緩やかな」比較を使用します。つまり、整数値を持つ文字列は、同じ値の整数と等しいと見なされます。
dot()
dotメソッドは、多次元コレクションを「ドット」表記を使用して深さを示す単一レベルのコレクションにフラット化します。
1$collection = collect(['products' => ['desk' => ['price' => 100]]]);2 3$flattened = $collection->dot();4 5$flattened->all();6 7// ['products.desk.price' => 100]
dump()
dumpメソッドは、コレクションのアイテムをダンプします。
1 2``````php 3$collection = collect(['John Doe', 'Jane Doe']); 4 5$collection->dump(); 6 7/* 8 Collection { 9 #items: array:2 [10 0 => "John Doe"11 1 => "Jane Doe"12 ]13 }14*/
コレクションをダンプした後にスクリプトの実行を停止したい場合は、代わりにddメソッドを使用してください。
duplicates()
duplicatesメソッドは、コレクションから重複する値を取得して返します。
1 2``````php3$collection = collect(['a', 'b', 'a', 'c', 'b']);4 5$collection->duplicates();6 7// [2 => 'a', 4 => 'b']
コレクションに配列またはオブジェクトが含まれている場合は、重複する値を確認したい属性のキーを渡すことができます。
1 2``````php 3$employees = collect([ 7]); 8 9$employees->duplicates('position');10 11// [2 => 'Developer']
duplicatesStrict()
このメソッドはduplicatesメソッドと同じシグネチャを持っています。ただし、すべての値は「厳密な」比較を使用して比較されます。
each()
eachメソッドは、コレクション内のアイテムを反復処理し、各アイテムをクロージャに渡します。
1$collection = collect([1, 2, 3, 4]);2 3$collection->each(function (int $item, int $key) {4 // ...5});
アイテムの反復処理を停止したい場合は、クロージャから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 3$collection->eachSpread(function (string $name, int $age) {4 // ...5});
コールバックからfalseを返すことで、アイテムの反復処理を停止できます。
1$collection->eachSpread(function (string $name, int $age) {2 return false;3});
ensure()
ensureメソッドは、コレクションのすべての要素が特定の型または型のリストであることを確認するために使用できます。そうでない場合、UnexpectedValueExceptionがスローされます。
1return $collection->ensure(User::class);2 3return $collection->ensure([User::class, Customer::class]);
string、int、float、bool、arrayなどのプリミティブ型も指定できます。
1return $collection->ensure('int');
ensureメソッドは、後で異なるタイプの要素がコレクションに追加されないことを保証するものではありません。
every()
everyメソッドを使用して、コレクションのすべての要素が特定の真理値テストに合格することを確認できます。
1collect([1, 2, 3, 4])->every(function (int $value, int $key) {2 return $value > 2;3});4 5// false
コレクションが空の場合、everyメソッドはtrueを返します。
1$collection = collect([]);2 3$collection->every(function (int $value, int $key) {4 return $value > 2;5});6 7// true
except()
exceptメソッドは、指定されたキーを持つアイテムを除く、コレクション内のすべてのアイテムを返します。
1$collection = collect(['product_id' => 1, 'price' => 100, 'discount' => false]);2 3$filtered = $collection->except(['price', 'discount']);4 5$filtered->all();6 7// ['product_id' => 1]
exceptの逆については、onlyメソッドを参照してください。
このメソッドの動作は、Eloquentコレクションを使用する場合に変更されます。
filter()
filterメソッドは、指定したコールバックを使用してコレクションをフィルタリングし、特定の真理値テストに合格したアイテムのみを保持します。
1$collection = collect([1, 2, 3, 4]);2 3$filtered = $collection->filter(function (int $value, int $key) {4 return $value > 2;5});6 7$filtered->all();8 9// [3, 4]
コールバックが指定されていない場合、falseに相当するコレクションのすべてのエントリが削除されます。
1$collection = collect([1, 2, 3, null, false, '', 0, []]);2 3$collection->filter()->all();4 5// [1, 2, 3]
filterの逆については、rejectメソッドを参照してください。
first()
firstメソッドは、特定の真理値テストに合格したコレクションの最初の要素を返します。
1collect([1, 2, 3, 4])->first(function (int $value, int $key) {2 return $value > 2;3});4 5// 3
firstメソッドを引数なしで呼び出して、コレクションの最初の要素を取得することもできます。コレクションが空の場合、nullが返されます。
1collect([1, 2, 3, 4])->first();2 3// 1
firstOrFail()
firstOrFailメソッドはfirstメソッドと同じですが、結果が見つからない場合はIlluminate\Support\ItemNotFoundException例外がスローされます。
1collect([1, 2, 3, 4])->firstOrFail(function (int $value, int $key) {2 return $value > 5;3});4 5// Throws ItemNotFoundException...
firstOrFailメソッドを引数なしで呼び出して、コレクションの最初の要素を取得することもできます。コレクションが空の場合、Illuminate\Support\ItemNotFoundException例外がスローされます。
1collect([])->firstOrFail();2 3// 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 8$collection->firstWhere('name', 'Linda'); 9 10// ['name' => 'Linda', 'age' => 14]
firstWhereメソッドを比較演算子とともに呼び出すこともできます。
1$collection->firstWhere('age', '>=', 18);2 3// ['name' => 'Diego', 'age' => 23]
whereメソッドと同様に、firstWhereメソッドに1つの引数を渡すことができます。このシナリオでは、firstWhereメソッドは、指定したアイテムキーの値が「true」である最初のアイテムを返します。
1$collection->firstWhere('age');2 3// ['name' => 'Linda', 'age' => 14]
flatMap()
flatMapメソッドはコレクションを反復処理し、各値を指定したクロージャに渡します。クロージャはアイテムを自由に変更して返すことができ、それによって変更されたアイテムの新しいコレクションが形成されます。その後、配列は1レベル平坦化されます。
1$collection = collect([ 2 ['name' => 'Sally'], 3 ['school' => 'Arkansas'], 4 ['age' => 28] 5]); 6 7$flattened = $collection->flatMap(function (array $values) { 8 return array_map('strtoupper', $values); 9});10 11$flattened->all();12 13// ['name' => 'SALLY', 'school' => 'ARKANSAS', 'age' => '28'];
flatten()
flattenメソッドは、多次元コレクションを1次元にフラット化します。
1$collection = collect([ 2 'name' => 'taylor', 3 'languages' => [ 4 'php', 'javascript' 5 ] 6]); 7 8$flattened = $collection->flatten(); 9 10$flattened->all();11 12// ['taylor', 'php', 'javascript'];
必要に応じて、flattenメソッドに「depth(深さ)」引数を渡すことができます。
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 16$products = $collection->flatten(1);17 18$products->values()->all();19 20/*21 [22 ['name' => 'iPhone 6S', 'brand' => 'Apple'],23 ['name' => 'Galaxy S7', 'brand' => 'Samsung'],24 ]25*/
この例では、depthを指定せずにflattenを呼び出すと、ネストされた配列もフラット化され、結果は['iPhone 6S', 'Apple', 'Galaxy S7', 'Samsung']になります。depthを指定すると、ネストされた配列がフラット化されるレベルの数を指定できます。
flip()
flipメソッドは、コレクションのキーとそれに対応する値を入れ替えます。
1$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);2 3$flipped = $collection->flip();4 5$flipped->all();6 7// ['taylor' => 'name', 'laravel' => 'framework']
forget()
forgetメソッドは、キーによってコレクションからアイテムを削除します。
1$collection = collect(['name' => 'taylor', 'framework' => 'laravel']); 2 3// Forget a single key... 4$collection->forget('name'); 5 6// ['framework' => 'laravel'] 7 8// Forget multiple keys... 9$collection->forget(['name', 'framework']);10 11// []
他のほとんどのコレクションメソッドとは異なり、forgetは新しく変更されたコレクションを返しません。呼び出されたコレクションを変更し、それを返します。
forPage()
forPageメソッドは、特定のページ番号に存在するアイテムを含む新しいコレクションを返します。このメソッドは、最初の引数としてページ番号を、2番目の引数としてページごとに表示するアイテムの数を取ります。
1$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]);2 3$chunk = $collection->forPage(2, 3);4 5$chunk->all();6 7// [4, 5, 6]
get()
getメソッドは、指定したキーのアイテムを返します。キーが存在しない場合、nullが返されます。
1$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);2 3$value = $collection->get('name');4 5// taylor
オプションで、2番目の引数としてデフォルト値を渡すことができます。
1$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);2 3$value = $collection->get('age', 34);4 5// 34
メソッドのデフォルト値としてコールバックを渡すこともできます。指定したキーが存在しない場合、コールバックの結果が返されます。
1$collection->get('email', function () {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 7$grouped = $collection->groupBy('account_id'); 8 9$grouped->all();10 11/*12 [13 'account-x10' => [14 ['account_id' => 'account-x10', 'product' => 'Chair'],15 ['account_id' => 'account-x10', 'product' => 'Bookcase'],16 ],17 'account-x11' => [18 ['account_id' => 'account-x11', 'product' => 'Desk'],19 ],20 ]21*/
文字列のkeyを渡す代わりに、コールバックを渡すことができます。コールバックは、グループ化のキーとして使用したい値を返す必要があります。
1$grouped = $collection->groupBy(function (array $item, int $key) { 2 return substr($item['account_id'], -3); 3}); 4 5$grouped->all(); 6 7/* 8 [ 9 'x10' => [10 ['account_id' => 'account-x10', 'product' => 'Chair'],11 ['account_id' => 'account-x10', 'product' => 'Bookcase'],12 ],13 'x11' => [14 ['account_id' => 'account-x11', 'product' => 'Desk'],15 ],16 ]17*/
複数のグループ化基準を配列として渡すことができます。各配列要素は、多次元配列内の対応するレベルに適用されます。
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 8$result = $data->groupBy(['skill', function (array $item) { 9 return $item['roles'];10}], preserveKeys: true);11 12/*13[14 1 => [15 'Role_1' => [16 10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],17 20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],18 ],19 'Role_2' => [20 20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],21 ],22 'Role_3' => [23 10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],24 ],25 ],26 2 => [27 'Role_1' => [28 30 => ['user' => 3, 'skill' => 2, 'roles' => ['Role_1']],29 ],30 'Role_2' => [31 40 => ['user' => 4, 'skill' => 2, 'roles' => ['Role_2']],32 ],33 ],34];35*/
has()
hasメソッドは、指定したキーがコレクションに存在するかどうかを判断します。
1$collection = collect(['account_id' => 1, 'product' => 'Desk', 'amount' => 5]); 2 3$collection->has('product'); 4 5// true 6 7$collection->has(['product', 'amount']); 8 9// true10 11$collection->has(['amount', 'price']);12 13// false
hasAny()
hasAnyメソッドは、指定したキーのいずれかがコレクションに存在するかどうかを判断します。
1$collection = collect(['account_id' => 1, 'product' => 'Desk', 'amount' => 5]);2 3$collection->hasAny(['product', 'price']);4 5// true6 7$collection->hasAny(['name', 'price']);8 9// false
implode()
implodeメソッドは、コレクション内のアイテムを結合します。その引数は、コレクション内のアイテムのタイプによって異なります。コレクションに配列またはオブジェクトが含まれている場合は、結合したい属性のキーと、値の間に配置したい「接着剤」となる文字列を渡す必要があります。
1$collection = collect([2 ['account_id' => 1, 'product' => 'Desk'],3 ['account_id' => 2, 'product' => 'Chair'],4]);5 6$collection->implode('product', ', ');7 8// Desk, Chair
コレクションに単純な文字列または数値が含まれている場合は、「接着剤」をメソッドの唯一の引数として渡す必要があります。
1collect([1, 2, 3, 4, 5])->implode('-');2 3// '1-2-3-4-5'
implodeされる値をフォーマットしたい場合は、implodeメソッドにクロージャを渡すことができます。
1$collection->implode(function (array $item, int $key) {2 return strtoupper($item['product']);3}, ', ');4 5// DESK, CHAIR
intersect()
intersectメソッドは、指定したarrayまたはコレクションに存在しない値を元のコレクションから削除します。結果のコレクションは、元のコレクションのキーを保持します。
1$collection = collect(['Desk', 'Sofa', 'Chair']);2 3$intersect = $collection->intersect(['Desk', 'Chair', 'Bookcase']);4 5$intersect->all();6 7// [0 => 'Desk', 2 => 'Chair']
このメソッドの動作は、Eloquentコレクションを使用する場合に変更されます。
intersectUsing()
intersectUsingメソッドは、カスタムコールバックを使用して値を比較し、指定したarrayまたはコレクションに存在しない値を元のコレクションから削除します。結果のコレクションは、元のコレクションのキーを保持します。
1$collection = collect(['Desk', 'Sofa', 'Chair']);2 3$intersect = $collection->intersectUsing(['desk', 'chair', 'bookcase'], function ($a, $b) {4 return strcasecmp($a, $b);5});6 7$intersect->all();8 9// [0 => 'Desk', 2 => 'Chair']
intersectAssoc()
intersectAssocメソッドは、元のコレクションを別のコレクションまたはarrayと比較し、指定されたすべてのコレクションに存在するキー/値ペアを返します。
1$collection = collect([ 2 'color' => 'red', 3 'size' => 'M', 4 'material' => 'cotton' 5]); 6 7$intersect = $collection->intersectAssoc([ 8 'color' => 'blue', 9 'size' => 'M',10 'material' => 'polyester'11]);12 13$intersect->all();14 15// ['size' => 'M']
intersectAssocUsing()
intersectAssocUsingメソッドは、元のコレクションを別のコレクションまたはarrayと比較し、キーと値の両方の等価性を判断するためのカスタム比較コールバックを使用して、両方に存在するキー/値ペアを返します。
1$collection = collect([ 2 'color' => 'red', 3 'Size' => 'M', 4 'material' => 'cotton', 5]); 6 7$intersect = $collection->intersectAssocUsing([ 8 'color' => 'blue', 9 'size' => 'M',10 'material' => 'polyester',11], function ($a, $b) {12 return strcasecmp($a, $b);13});14 15$intersect->all();16 17// ['Size' => 'M']
intersectByKeys()
intersectByKeysメソッドは、指定したarrayまたはコレクションに存在しないキーとそれに対応する値を元のコレクションから削除します。
1$collection = collect([ 2 'serial' => 'UX301', 'type' => 'screen', 'year' => 2009, 3]); 4 5$intersect = $collection->intersectByKeys([ 6 'reference' => 'UX404', 'type' => 'tab', 'year' => 2011, 7]); 8 9$intersect->all();10 11// ['type' => 'screen', 'year' => 2009]
isEmpty()
isEmptyメソッドは、コレクションが空の場合はtrueを返し、そうでない場合はfalseを返します。
1collect([])->isEmpty();2 3// true
isNotEmpty()
isNotEmptyメソッドは、コレクションが空でない場合はtrueを返し、そうでない場合はfalseを返します。
1collect([])->isNotEmpty();2 3// false
join()
joinメソッドは、コレクションの値を文字列で結合します。このメソッドの2番目の引数を使用して、最後の要素を文字列にどのように追加するかを指定することもできます。
1collect(['a', 'b', 'c'])->join(', '); // 'a, b, c'2collect(['a', 'b', 'c'])->join(', ', ', and '); // 'a, b, and c'3collect(['a', 'b'])->join(', ', ' and '); // 'a and b'4collect(['a'])->join(', ', ' and '); // 'a'5collect([])->join(', ', ' and '); // ''
keyBy()
keyByメソッドは、指定したキーでコレクションにキーを付けます。複数のアイテムが同じキーを持つ場合、新しいコレクションには最後のアイテムのみが表示されます。
1$collection = collect([ 2 ['product_id' => 'prod-100', 'name' => 'Desk'], 3 ['product_id' => 'prod-200', 'name' => 'Chair'], 4]); 5 6$keyed = $collection->keyBy('product_id'); 7 8$keyed->all(); 9 10/*11 [12 'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],13 'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],14 ]15*/
メソッドにコールバックを渡すこともできます。コールバックは、コレクションのキーとして使用する値を返す必要があります。
1$keyed = $collection->keyBy(function (array $item, int $key) { 2 return strtoupper($item['product_id']); 3}); 4 5$keyed->all(); 6 7/* 8 [ 9 'PROD-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],10 'PROD-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],11 ]12*/
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 6$keys = $collection->keys(); 7 8$keys->all(); 9 10// ['prod-100', 'prod-200']
last()
lastメソッドは、特定の真理値テストに合格したコレクションの最後の要素を返します。
1collect([1, 2, 3, 4])->last(function (int $value, int $key) {2 return $value < 3;3});4 5// 2
lastメソッドを引数なしで呼び出して、コレクションの最後の要素を取得することもできます。コレクションが空の場合、nullが返されます。
1collect([1, 2, 3, 4])->last();2 3// 4
lazy()
lazyメソッドは、アイテムの基になる配列から新しいLazyCollectionインスタンスを返します。
1$lazyCollection = collect([1, 2, 3, 4])->lazy();2 3$lazyCollection::class;4 5// Illuminate\Support\LazyCollection6 7$lazyCollection->all();8 9// [1, 2, 3, 4]
これは、多くのアイテムを含む巨大なCollectionに対して変換を実行する必要がある場合に特に役立ちます。
1$count = $hugeCollection2 ->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 3$multiplied = $collection->map(function (int $item, int $key) {4 return $item * 2;5});6 7$multiplied->all();8 9// [2, 4, 6, 8, 10]
他のほとんどのコレクションメソッドと同様に、mapは新しいコレクションインスタンスを返します。呼び出されたコレクションは変更しません。元のコレクションを変換したい場合は、transformメソッドを使用してください。
mapInto()
mapInto()メソッドはコレクションを反復処理し、値をコンストラクタに渡して、指定したクラスの新しいインスタンスを作成します。
1class Currency 2{ 3 /** 4 * Create a new currency instance. 5 */ 6 function __construct( 7 public string $code, 8 ) {} 9}10 11$collection = collect(['USD', 'EUR', 'GBP']);12 13$currencies = $collection->mapInto(Currency::class);14 15$currencies->all();16 17// [Currency('USD'), Currency('EUR'), Currency('GBP')]
mapSpread()
mapSpreadメソッドはコレクションのアイテムを反復処理し、ネストされた各アイテムの値を指定したクロージャに渡します。クロージャはアイテムを自由に変更して返すことができ、それによって変更されたアイテムの新しいコレクションが形成されます。
1$collection = collect([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); 2 3$chunks = $collection->chunk(2); 4 5$sequence = $chunks->mapSpread(function (int $even, int $odd) { 6 return $even + $odd; 7}); 8 9$sequence->all();10 11// [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 16$grouped = $collection->mapToGroups(function (array $item, int $key) {17 return [$item['department'] => $item['name']];18});19 20$grouped->all();21 22/*23 [24 'Sales' => ['John Doe', 'Jane Doe'],25 'Marketing' => ['Johnny Doe'],26 ]27*/28 29$grouped->get('Sales')->all();30 31// ['John Doe', 'Jane Doe']
mapWithKeys()
mapWithKeysメソッドはコレクションを反復処理し、各値を指定したコールバックに渡します。コールバックは、単一のキー/値ペアを含む連想配列を返す必要があります。
1$collection = collect([ 2 [ 3 'name' => 'John', 4 'department' => 'Sales', 6 ], 7 [ 8 'name' => 'Jane', 9 'department' => 'Marketing',11 ]12]);13 14$keyed = $collection->mapWithKeys(function (array $item, int $key) {15 return [$item['email'] => $item['name']];16});17 18$keyed->all();19 20/*21 [22 '[email protected]' => 'John',23 '[email protected]' => 'Jane',24 ]25*/
max()
maxメソッドは、指定したキーの最大値を返します。
1$max = collect([ 2 ['foo' => 10], 3 ['foo' => 20] 4])->max('foo'); 5 6// 20 7 8$max = collect([1, 2, 3, 4, 5])->max(); 9 10// 5
median()
medianメソッドは、指定したキーの中央値を返します。
1$median = collect([ 2 ['foo' => 10], 3 ['foo' => 10], 4 ['foo' => 20], 5 ['foo' => 40] 6])->median('foo'); 7 8// 15 9 10$median = collect([1, 1, 2, 4])->median();11 12// 1.5
merge()
mergeメソッドは、指定した配列またはコレクションを元のコレクションとマージします。指定したアイテムの文字列キーが元のコレクションの文字列キーと一致する場合、指定したアイテムの値が元のコレクションの値を上書きします。
1$collection = collect(['product_id' => 1, 'price' => 100]);2 3$merged = $collection->merge(['price' => 200, 'discount' => false]);4 5$merged->all();6 7// ['product_id' => 1, 'price' => 200, 'discount' => false]
指定したアイテムのキーが数値の場合、値はコレクションの末尾に追加されます。
1$collection = collect(['Desk', 'Chair']);2 3$merged = $collection->merge(['Bookcase', 'Door']);4 5$merged->all();6 7// ['Desk', 'Chair', 'Bookcase', 'Door']
mergeRecursive()
mergeRecursiveメソッドは、指定した配列またはコレクションを元のコレクションと再帰的にマージします。指定したアイテムの文字列キーが元のコレクションの文字列キーと一致する場合、これらのキーの値は配列にマージされ、これは再帰的に行われます。
1$collection = collect(['product_id' => 1, 'price' => 100]); 2 3$merged = $collection->mergeRecursive([ 4 'product_id' => 2, 5 'price' => 200, 6 'discount' => false 7]); 8 9$merged->all();10 11// ['product_id' => [1, 2], 'price' => [100, 200], 'discount' => false]
min()
minメソッドは、指定したキーの最小値を返します。
1$min = collect([['foo' => 10], ['foo' => 20]])->min('foo');2 3// 104 5$min = collect([1, 2, 3, 4, 5])->min();6 7// 1
mode()
modeメソッドは、指定したキーの最頻値を返します。
1$mode = collect([ 2 ['foo' => 10], 3 ['foo' => 10], 4 ['foo' => 20], 5 ['foo' => 40] 6])->mode('foo'); 7 8// [10] 9 10$mode = collect([1, 1, 2, 4])->mode();11 12// [1]13 14$mode = collect([1, 1, 2, 2])->mode();15 16// [1, 2]
multiply()
multiplyメソッドは、コレクション内のすべてのアイテムの指定された数のコピーを作成します。
1$users = collect([ 4])->multiply(3); 5 6/* 7 [ 8 ['name' => 'User #1', 'email' => '[email protected]'], 9 ['name' => 'User #2', 'email' => '[email protected]'],10 ['name' => 'User #1', 'email' => '[email protected]'],11 ['name' => 'User #2', 'email' => '[email protected]'],12 ['name' => 'User #1', 'email' => '[email protected]'],13 ['name' => 'User #2', 'email' => '[email protected]'],14 ]15*/
nth()
nthメソッドは、n番目ごとの要素で構成される新しいコレクションを作成します。
1$collection = collect(['a', 'b', 'c', 'd', 'e', 'f']);2 3$collection->nth(4);4 5// ['a', 'e']
オプションで、2番目の引数として開始オフセットを渡すことができます。
1$collection->nth(4, 1);2 3// ['b', 'f']
only()
onlyメソッドは、指定されたキーを持つコレクションのアイテムを返します。
1$collection = collect([ 2 'product_id' => 1, 3 'name' => 'Desk', 4 'price' => 100, 5 'discount' => false 6]); 7 8$filtered = $collection->only(['product_id', 'name']); 9 10$filtered->all();11 12// ['product_id' => 1, 'name' => 'Desk']
onlyの逆については、exceptメソッドを参照してください。
このメソッドの動作は、Eloquentコレクションを使用する場合に変更されます。
pad()
padメソッドは、配列が指定されたサイズに達するまで、指定された値で配列を埋めます。このメソッドは、PHPのarray_pad関数のように動作します。
左側にパディングするには、負のサイズを指定する必要があります。指定したサイズの絶対値が配列の長さ以下の場合、パディングは行われません。
1$collection = collect(['A', 'B', 'C']); 2 3$filtered = $collection->pad(5, 0); 4 5$filtered->all(); 6 7// ['A', 'B', 'C', 0, 0] 8 9$filtered = $collection->pad(-5, 0);10 11$filtered->all();12 13// [0, 0, 'A', 'B', 'C']
partition()
partitionメソッドは、PHPの配列の分割代入と組み合わせて、特定の真理値テストに合格する要素とそうでない要素を分離できます。
1$collection = collect([1, 2, 3, 4, 5, 6]); 2 3[$underThree, $equalOrAboveThree] = $collection->partition(function (int $i) { 4 return $i < 3; 5}); 6 7$underThree->all(); 8 9// [1, 2]10 11$equalOrAboveThree->all();12 13// [3, 4, 5, 6]
percentage()
percentageメソッドを使用すると、特定の真理値テストに合格するコレクション内のアイテムの割合をすばやく判断できます。
1$collection = collect([1, 1, 2, 2, 2, 3]);2 3$percentage = $collection->percentage(fn ($value) => $value === 1);4 5// 33.33
デフォルトでは、パーセンテージは小数点以下2桁に丸められます。ただし、メソッドに2番目の引数を指定することで、この動作をカスタマイズできます。
1$percentage = $collection->percentage(fn ($value) => $value === 1, precision: 3);2 3// 33.333
pipe()
pipeメソッドは、コレクションを指定したクロージャに渡し、実行されたクロージャの結果を返します。
1$collection = collect([1, 2, 3]);2 3$piped = $collection->pipe(function (Collection $collection) {4 return $collection->sum();5});6 7// 6
pipeInto()
pipeIntoメソッドは、指定したクラスの新しいインスタンスを作成し、コレクションをコンストラクタに渡します。
1class ResourceCollection 2{ 3 /** 4 * Create a new ResourceCollection instance. 5 */ 6 public function __construct( 7 public Collection $collection, 8 ) {} 9}10 11$collection = collect([1, 2, 3]);12 13$resource = $collection->pipeInto(ResourceCollection::class);14 15$resource->collection->all();16 17// [1, 2, 3]
pipeThrough()
pipeThroughメソッドは、コレクションを指定したクロージャの配列に渡し、実行されたクロージャの結果を返します。
1use Illuminate\Support\Collection; 2 3$collection = collect([1, 2, 3]); 4 5$result = $collection->pipeThrough([ 6 function (Collection $collection) { 7 return $collection->merge([4, 5]); 8 }, 9 function (Collection $collection) {10 return $collection->sum();11 },12]);13 14// 15
pluck()
pluckメソッドは、指定したキーのすべての値を取得します。
1$collection = collect([ 2 ['product_id' => 'prod-100', 'name' => 'Desk'], 3 ['product_id' => 'prod-200', 'name' => 'Chair'], 4]); 5 6$plucked = $collection->pluck('name'); 7 8$plucked->all(); 9 10// ['Desk', 'Chair']
結果のコレクションにどのようにキーを付けたいかを指定することもできます。
1$plucked = $collection->pluck('name', 'product_id');2 3$plucked->all();4 5// ['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 16$plucked = $collection->pluck('speakers.first_day');17 18$plucked->all();19 20// [['Rosa', 'Judith'], ['Abigail', 'Joey']]
重複するキーが存在する場合、最後に一致した要素がpluckされたコレクションに挿入されます。
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 8$plucked = $collection->pluck('color', 'brand'); 9 10$plucked->all();11 12// ['Tesla' => 'black', 'Pagani' => 'orange']
pop()
popメソッドは、コレクションから最後のアイテムを削除して返します。
1$collection = collect([1, 2, 3, 4, 5]);2 3$collection->pop();4 5// 56 7$collection->all();8 9// [1, 2, 3, 4]
popメソッドに整数を渡して、コレクションの末尾から複数のアイテムを削除して返すことができます。
1$collection = collect([1, 2, 3, 4, 5]);2 3$collection->pop(3);4 5// collect([5, 4, 3])6 7$collection->all();8 9// [1, 2]
prepend()
prependメソッドは、コレクションの先頭にアイテムを追加します。
1$collection = collect([1, 2, 3, 4, 5]);2 3$collection->prepend(0);4 5$collection->all();6 7// [0, 1, 2, 3, 4, 5]
先頭に追加されたアイテムのキーを指定するために、2番目の引数を渡すこともできます。
1$collection = collect(['one' => 1, 'two' => 2]);2 3$collection->prepend(0, 'zero');4 5$collection->all();6 7// ['zero' => 0, 'one' => 1, 'two' => 2]
pull()
pullメソッドは、キーによってコレクションからアイテムを削除して返します。
1$collection = collect(['product_id' => 'prod-100', 'name' => 'Desk']);2 3$collection->pull('name');4 5// 'Desk'6 7$collection->all();8 9// ['product_id' => 'prod-100']
push()
pushメソッドは、コレクションの末尾にアイテムを追加します。
1$collection = collect([1, 2, 3, 4]);2 3$collection->push(5);4 5$collection->all();6 7// [1, 2, 3, 4, 5]
put()
putメソッドは、コレクションに指定したキーと値を設定します。
1$collection = collect(['product_id' => 1, 'name' => 'Desk']);2 3$collection->put('price', 100);4 5$collection->all();6 7// ['product_id' => 1, 'name' => 'Desk', 'price' => 100]
random()
randomメソッドは、コレクションからランダムなアイテムを返します。
1$collection = collect([1, 2, 3, 4, 5]);2 3$collection->random();4 5// 4 - (retrieved randomly)
ランダムに取得したいアイテムの数を指定するためにrandomに整数を渡すことができます。受け取りたいアイテムの数を明示的に渡すと、常にアイテムのコレクションが返されます。
1$random = $collection->random(3);2 3$random->all();4 5// [2, 4, 5] - (retrieved randomly)
コレクションインスタンスのアイテム数がリクエストされた数より少ない場合、randomメソッドはInvalidArgumentExceptionをスローします。
randomメソッドはクロージャも引数に取り、現在のコレクションインスタンスを受け取ります。
1use Illuminate\Support\Collection;2 3$random = $collection->random(fn (Collection $items) => min(10, count($items)));4 5$random->all();6 7// [1, 2, 3, 4, 5] - (retrieved randomly)
range()
rangeメソッドは、指定された範囲の整数を含むコレクションを返します。
1$collection = collect()->range(3, 6);2 3$collection->all();4 5// [3, 4, 5, 6]
reduce()
reduceメソッドは、コレクションを単一の値に縮小し、各反復の結果を後続の反復に渡します。
1$collection = collect([1, 2, 3]);2 3$total = $collection->reduce(function (?int $carry, int $item) {4 return $carry + $item;5});6 7// 6
最初の反復での$carryの値はnullですが、reduceに2番目の引数を渡すことで、その初期値を指定できます。
1$collection->reduce(function (int $carry, int $item) {2 return $carry + $item;3}, 4);4 5// 10
reduceメソッドは、連想コレクションの配列キーも指定したコールバックに渡します。
1$collection = collect([ 2 'usd' => 1400, 3 'gbp' => 1200, 4 'eur' => 1000, 5]); 6 7$ratio = [ 8 'usd' => 1, 9 'gbp' => 1.37,10 'eur' => 1.22,11];12 13$collection->reduce(function (int $carry, int $value, int $key) use ($ratio) {14 return $carry + ($value * $ratio[$key]);15});16 17// 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 7 $creditsRemaining -= $image->creditsRequired(); 8 } 9 10 return [$creditsRemaining, $batch];11 }, $creditsAvailable, collect());
reject()
rejectメソッドは、指定したクロージャを使用してコレクションをフィルタリングします。アイテムが結果のコレクションから削除されるべき場合、クロージャはtrueを返す必要があります。
1$collection = collect([1, 2, 3, 4]);2 3$filtered = $collection->reject(function (int $value, int $key) {4 return $value > 2;5});6 7$filtered->all();8 9// [1, 2]
rejectメソッドの逆については、filterメソッドを参照してください。
replace()
replaceメソッドはmergeと同様に動作します。ただし、文字列キーを持つ一致するアイテムを上書きすることに加えて、replaceメソッドは、一致する数値キーを持つコレクション内のアイテムも上書きします。
1$collection = collect(['Taylor', 'Abigail', 'James']);2 3$replaced = $collection->replace([1 => 'Victoria', 3 => 'Finn']);4 5$replaced->all();6 7// ['Taylor', 'Victoria', 'James', 'Finn']
replaceRecursive()
このメソッドはreplaceのように機能しますが、配列に再帰し、内部の値に同じ置換プロセスを適用します。
1$collection = collect([ 2 'Taylor', 3 'Abigail', 4 [ 5 'James', 6 'Victoria', 7 'Finn' 8 ] 9]);10 11$replaced = $collection->replaceRecursive([12 'Charlie',13 2 => [1 => 'King']14]);15 16$replaced->all();17 18// ['Charlie', 'Abigail', ['James', 'King', 'Finn']]
reverse()
reverseメソッドは、コレクションのアイテムの順序を逆にし、元のキーを保持します。
1$collection = collect(['a', 'b', 'c', 'd', 'e']); 2 3$reversed = $collection->reverse(); 4 5$reversed->all(); 6 7/* 8 [ 9 4 => 'e',10 3 => 'd',11 2 => 'c',12 1 => 'b',13 0 => 'a',14 ]15*/
search()
searchメソッドは、コレクションで指定した値を検索し、見つかった場合はそのキーを返します。アイテムが見つからない場合、falseが返されます。
1$collection = collect([2, 4, 6, 8]);2 3$collection->search(4);4 5// 1
検索は「緩やかな」比較を使用して行われます。つまり、整数値を持つ文字列は、同じ値の整数と等しいと見なされます。「厳密な」比較を使用するには、メソッドの2番目の引数としてtrueを渡します。
1collect([2, 4, 6, 8])->search('4', strict: true);2 3// false
代わりに、独自のクロージャを指定して、特定の真理値テストに合格する最初のアイテムを検索することもできます。
1collect([2, 4, 6, 8])->search(function (int $item, int $key) {2 return $item > 5;3});4 5// 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 6$users->select(['name', 'role']); 7 8/* 9 [10 ['name' => 'Taylor Otwell', 'role' => 'Developer'],11 ['name' => 'Victoria Faith', 'role' => 'Researcher'],12 ],13*/
shift()
shiftメソッドは、コレクションから最初のアイテムを削除して返します。
1$collection = collect([1, 2, 3, 4, 5]);2 3$collection->shift();4 5// 16 7$collection->all();8 9// [2, 3, 4, 5]
shiftメソッドに整数を渡して、コレクションの先頭から複数のアイテムを削除して返すことができます。
1$collection = collect([1, 2, 3, 4, 5]);2 3$collection->shift(3);4 5// collect([1, 2, 3])6 7$collection->all();8 9// [4, 5]
shuffle()
shuffleメソッドは、コレクション内のアイテムをランダムにシャッフルします。
1$collection = collect([1, 2, 3, 4, 5]);2 3$shuffled = $collection->shuffle();4 5$shuffled->all();6 7// [3, 2, 5, 1, 4] - (generated randomly)
skip()
skipメソッドは、コレクションの先頭から指定された数の要素を削除した新しいコレクションを返します。
1$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);2 3$collection = $collection->skip(4);4 5$collection->all();6 7// [5, 6, 7, 8, 9, 10]
skipUntil()
skipUntilメソッドは、指定したコールバックがfalseを返す間、コレクションのアイテムをスキップします。コールバックがtrueを返すと、コレクション内の残りのすべてのアイテムが新しいコレクションとして返されます。
1$collection = collect([1, 2, 3, 4]);2 3$subset = $collection->skipUntil(function (int $item) {4 return $item >= 3;5});6 7$subset->all();8 9// [3, 4]
skipUntilメソッドに単純な値を渡して、指定した値が見つかるまですべてのアイテムをスキップすることもできます。
1$collection = collect([1, 2, 3, 4]);2 3$subset = $collection->skipUntil(3);4 5$subset->all();6 7// [3, 4]
指定した値が見つからないか、コールバックがtrueを返さない場合、skipUntilメソッドは空のコレクションを返します。
skipWhile()
skipWhileメソッドは、指定したコールバックがtrueを返す間、コレクションのアイテムをスキップします。コールバックがfalseを返すと、コレクション内の残りのすべてのアイテムが新しいコレクションとして返されます。
1$collection = collect([1, 2, 3, 4]);2 3$subset = $collection->skipWhile(function (int $item) {4 return $item <= 3;5});6 7$subset->all();8 9// [4]
コールバックがfalseを返さない場合、skipWhileメソッドは空のコレクションを返します。
slice()
sliceメソッドは、指定したインデックスから始まるコレクションのスライスを返します。
1$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);2 3$slice = $collection->slice(4);4 5$slice->all();6 7// [5, 6, 7, 8, 9, 10]
返されるスライスのサイズを制限したい場合は、メソッドの2番目の引数として目的のサイズを渡します。
1$slice = $collection->slice(4, 2);2 3$slice->all();4 5// [5, 6]
返されるスライスはデフォルトでキーを保持します。元のキーを保持したくない場合は、valuesメソッドを使用して再インデックスできます。
sliding()
slidingメソッドは、コレクション内のアイテムの「スライディングウィンドウ」ビューを表すチャンクの新しいコレクションを返します。
1$collection = collect([1, 2, 3, 4, 5]);2 3$chunks = $collection->sliding(2);4 5$chunks->toArray();6 7// [[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 3$chunks = $collection->sliding(3, step: 2);4 5$chunks->toArray();6 7// [[1, 2, 3], [3, 4, 5]]
sole()
soleメソッドは、特定の真理値テストに合格するコレクションの最初の要素を返しますが、真理値テストが正確に1つの要素に一致する場合に限ります。
1collect([1, 2, 3, 4])->sole(function (int $value, int $key) {2 return $value === 2;3});4 5// 2
soleメソッドにキー/値ペアを渡すこともできます。これにより、指定したペアに一致するコレクションの最初の要素が返されますが、正確に1つの要素が一致する場合に限ります。
1$collection = collect([2 ['product' => 'Desk', 'price' => 200],3 ['product' => 'Chair', 'price' => 100],4]);5 6$collection->sole('product', 'Chair');7 8// ['product' => 'Chair', 'price' => 100]
または、soleメソッドを引数なしで呼び出して、要素が1つしかない場合にコレクションの最初の要素を取得することもできます。
1$collection = collect([2 ['product' => 'Desk', 'price' => 200],3]);4 5$collection->sole();6 7// ['product' => 'Desk', 'price' => 200]
soleメソッドによって返されるべき要素がコレクションにない場合、\Illuminate\Collections\ItemNotFoundException例外がスローされます。返されるべき要素が複数ある場合、\Illuminate\Collections\MultipleItemsFoundExceptionがスローされます。
some()
containsメソッドのエイリアスです。
sort()
sortメソッドはコレクションをソートします。ソートされたコレクションは元の配列キーを保持するため、次の例ではvaluesメソッドを使用してキーを連続した番号のインデックスにリセットします。
1$collection = collect([5, 3, 1, 2, 4]);2 3$sorted = $collection->sort();4 5$sorted->values()->all();6 7// [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 7$sorted = $collection->sortBy('price'); 8 9$sorted->values()->all();10 11/*12 [13 ['name' => 'Chair', 'price' => 100],14 ['name' => 'Bookcase', 'price' => 150],15 ['name' => 'Desk', 'price' => 200],16 ]17*/
sortByメソッドは、2番目の引数としてソートフラグを取ります。
1$collection = collect([ 2 ['title' => 'Item 1'], 3 ['title' => 'Item 12'], 4 ['title' => 'Item 3'], 5]); 6 7$sorted = $collection->sortBy('title', SORT_NATURAL); 8 9$sorted->values()->all();10 11/*12 [13 ['title' => 'Item 1'],14 ['title' => 'Item 3'],15 ['title' => 'Item 12'],16 ]17*/
または、独自のクロージャを渡して、コレクションの値をどのようにソートするかを決定することもできます。
1$collection = collect([ 2 ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']], 3 ['name' => 'Chair', 'colors' => ['Black']], 4 ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']], 5]); 6 7$sorted = $collection->sortBy(function (array $product, int $key) { 8 return count($product['colors']); 9});10 11$sorted->values()->all();12 13/*14 [15 ['name' => 'Chair', 'colors' => ['Black']],16 ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],17 ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],18 ]19*/
コレクションを複数の属性でソートしたい場合は、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 8$sorted = $collection->sortBy([ 9 ['name', 'asc'],10 ['age', 'desc'],11]);12 13$sorted->values()->all();14 15/*16 [17 ['name' => 'Abigail Otwell', 'age' => 32],18 ['name' => 'Abigail Otwell', 'age' => 30],19 ['name' => 'Taylor Otwell', 'age' => 36],20 ['name' => 'Taylor Otwell', 'age' => 34],21 ]22*/
コレクションを複数の属性でソートする場合、各ソート操作を定義するクロージャを提供することもできます。
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 8$sorted = $collection->sortBy([ 9 fn (array $a, array $b) => $a['name'] <=> $b['name'],10 fn (array $a, array $b) => $b['age'] <=> $a['age'],11]);12 13$sorted->values()->all();14 15/*16 [17 ['name' => 'Abigail Otwell', 'age' => 32],18 ['name' => 'Abigail Otwell', 'age' => 30],19 ['name' => 'Taylor Otwell', 'age' => 36],20 ['name' => 'Taylor Otwell', 'age' => 34],21 ]22*/
sortByDesc()
このメソッドはsortByメソッドと同じシグネチャを持っていますが、コレクションを逆の順序でソートします。
sortDesc()
このメソッドは、sortメソッドとは逆の順序でコレクションをソートします。
1$collection = collect([5, 3, 1, 2, 4]);2 3$sorted = $collection->sortDesc();4 5$sorted->values()->all();6 7// [5, 4, 3, 2, 1]
sortとは異なり、sortDescにクロージャを渡すことはできません。代わりに、sortメソッドを使用して比較を反転させる必要があります。
sortKeys()
sortKeysメソッドは、基になる連想配列のキーによってコレクションをソートします。
1$collection = collect([ 2 'id' => 22345, 3 'first' => 'John', 4 'last' => 'Doe', 5]); 6 7$sorted = $collection->sortKeys(); 8 9$sorted->all();10 11/*12 [13 'first' => 'John',14 'id' => 22345,15 'last' => 'Doe',16 ]17*/
sortKeysDesc()
このメソッドはsortKeysメソッドと同じシグネチャを持っていますが、コレクションを逆の順序でソートします。
sortKeysUsing()
sortKeysUsingメソッドは、コールバックを使用して、基になる連想配列のキーによってコレクションをソートします。
1$collection = collect([ 2 'ID' => 22345, 3 'first' => 'John', 4 'last' => 'Doe', 5]); 6 7$sorted = $collection->sortKeysUsing('strnatcasecmp'); 8 9$sorted->all();10 11/*12 [13 'first' => 'John',14 'ID' => 22345,15 'last' => 'Doe',16 ]17*/
コールバックは、ゼロより小さい、等しい、または大きい整数を返す比較関数でなければなりません。詳細については、sortKeysUsingメソッドが内部で利用するPHP関数であるuksortに関するPHPドキュメントを参照してください。
splice()
spliceメソッドは、指定したインデックスから始まるアイテムのスライスを削除して返します。
1$collection = collect([1, 2, 3, 4, 5]); 2 3$chunk = $collection->splice(2); 4 5$chunk->all(); 6 7// [3, 4, 5] 8 9$collection->all();10 11// [1, 2]
2番目の引数を渡して、結果のコレクションのサイズを制限できます。
1$collection = collect([1, 2, 3, 4, 5]); 2 3$chunk = $collection->splice(2, 1); 4 5$chunk->all(); 6 7// [3] 8 9$collection->all();10 11// [1, 2, 4, 5]
さらに、3番目の引数として、コレクションから削除されたアイテムを置き換える新しいアイテムを含む引数を渡すことができます。
1$collection = collect([1, 2, 3, 4, 5]); 2 3$chunk = $collection->splice(2, 1, [10, 11]); 4 5$chunk->all(); 6 7// [3] 8 9$collection->all();10 11// [1, 2, 10, 11, 4, 5]
split()
splitメソッドは、コレクションを指定した数のグループに分割します。
1$collection = collect([1, 2, 3, 4, 5]);2 3$groups = $collection->split(3);4 5$groups->all();6 7// [[1, 2], [3, 4], [5]]
splitIn()
splitInメソッドは、コレクションを指定した数のグループに分割し、非終端グループを完全に埋めてから、残りを最後のグループに割り当てます。
1$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);2 3$groups = $collection->splitIn(3);4 5$groups->all();6 7// [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]
sum()
sumメソッドは、コレクション内のすべてのアイテムの合計を返します。
1collect([1, 2, 3, 4, 5])->sum();2 3// 15
コレクションにネストされた配列やオブジェクトが含まれている場合は、合計する値を決定するために使用されるキーを渡す必要があります。
1$collection = collect([2 ['name' => 'JavaScript: The Good Parts', 'pages' => 176],3 ['name' => 'JavaScript: The Definitive Guide', 'pages' => 1096],4]);5 6$collection->sum('pages');7 8// 1272
さらに、独自のクロージャを渡して、コレクションのどの値を合計するかを決定することもできます。
1$collection = collect([ 2 ['name' => 'Chair', 'colors' => ['Black']], 3 ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']], 4 ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']], 5]); 6 7$collection->sum(function (array $product) { 8 return count($product['colors']); 9});10 11// 6
take()
takeメソッドは、指定した数のアイテムを持つ新しいコレクションを返します。
1$collection = collect([0, 1, 2, 3, 4, 5]);2 3$chunk = $collection->take(3);4 5$chunk->all();6 7// [0, 1, 2]
負の整数を渡して、コレクションの末尾から指定した数のアイテムを取得することもできます。
1$collection = collect([0, 1, 2, 3, 4, 5]);2 3$chunk = $collection->take(-2);4 5$chunk->all();6 7// [4, 5]
takeUntil()
takeUntilメソッドは、指定したコールバックがtrueを返すまでコレクション内のアイテムを返します。
1$collection = collect([1, 2, 3, 4]);2 3$subset = $collection->takeUntil(function (int $item) {4 return $item >= 3;5});6 7$subset->all();8 9// [1, 2]
takeUntilメソッドに単純な値を渡して、指定した値が見つかるまでアイテムを取得することもできます。
1$collection = collect([1, 2, 3, 4]);2 3$subset = $collection->takeUntil(3);4 5$subset->all();6 7// [1, 2]
指定した値が見つからないか、コールバックがtrueを返さない場合、takeUntilメソッドはコレクション内のすべてのアイテムを返します。
takeWhile()
takeWhileメソッドは、指定したコールバックがfalseを返すまでコレクション内のアイテムを返します。
1$collection = collect([1, 2, 3, 4]);2 3$subset = $collection->takeWhile(function (int $item) {4 return $item < 3;5});6 7$subset->all();8 9// [1, 2]
コールバックがfalseを返さない場合、takeWhileメソッドはコレクション内のすべてのアイテムを返します。
tap()
tapメソッドは、コレクションを指定したコールバックに渡し、特定の時点でコレクションに「タップ」して、コレクション自体に影響を与えることなくアイテムを操作できるようにします。その後、コレクションはtapメソッドによって返されます。
1collect([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 8// 1
times()
静的なtimesメソッドは、指定したクロージャを指定した回数呼び出すことによって、新しいコレクションを作成します。
1$collection = Collection::times(10, function (int $number) {2 return $number * 9;3});4 5$collection->all();6 7// [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]
toArray()
toArrayメソッドは、コレクションをプレーンなPHParrayに変換します。コレクションの値がEloquentモデルである場合、モデルも配列に変換されます。
1$collection = collect(['name' => 'Desk', 'price' => 200]);2 3$collection->toArray();4 5/*6 [7 ['name' => 'Desk', 'price' => 200],8 ]9*/
toArrayは、Arrayableのインスタンスであるコレクションのネストされたオブジェクトもすべて配列に変換します。コレクションの基になる生の配列を取得したい場合は、代わりにallメソッドを使用してください。
toJson()
toJsonメソッドは、コレクションをJSONシリアル化された文字列に変換します。
1$collection = collect(['name' => 'Desk', 'price' => 200]);2 3$collection->toJson();4 5// '{"name":"Desk", "price":200}'
transform()
transformメソッドはコレクションを反復処理し、コレクション内の各アイテムで指定したコールバックを呼び出します。コレクション内のアイテムは、コールバックによって返された値に置き換えられます。
1$collection = collect([1, 2, 3, 4, 5]);2 3$collection->transform(function (int $item, int $key) {4 return $item * 2;5});6 7$collection->all();8 9// [2, 4, 6, 8, 10]
他のほとんどのコレクションメソッドとは異なり、transformはコレクション自体を変更します。代わりに新しいコレクションを作成したい場合は、mapメソッドを使用してください。
undot()
undotメソッドは、「ドット」表記を使用する1次元コレクションを多次元コレクションに展開します。
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 11$person = $person->undot();12 13$person->toArray();14 15/*16 [17 "name" => [18 "first_name" => "Marie",19 "last_name" => "Valentine",20 ],21 "address" => [22 "line_1" => "2992 Eagle Drive",23 "line_2" => "",24 "suburb" => "Detroit",25 "state" => "MI",26 "postcode" => "48219",27 ],28 ]29*/
union()
unionメソッドは、指定した配列をコレクションに追加します。指定した配列に元のコレクションに既に存在するキーが含まれている場合、元のコレクションの値が優先されます。
1$collection = collect([1 => ['a'], 2 => ['b']]);2 3$union = $collection->union([3 => ['c'], 1 => ['d']]);4 5$union->all();6 7// [1 => ['a'], 2 => ['b'], 3 => ['c']]
unique()
uniqueメソッドは、コレクション内のすべての一意のアイテムを返します。返されたコレクションは元の配列キーを保持するため、次の例ではvaluesメソッドを使用してキーを連続した番号のインデックスにリセットします。
1$collection = collect([1, 1, 2, 2, 3, 4, 2]);2 3$unique = $collection->unique();4 5$unique->values()->all();6 7// [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 9$unique = $collection->unique('brand');10 11$unique->values()->all();12 13/*14 [15 ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],16 ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],17 ]18*/
最後に、独自のクロージャをuniqueメソッドに渡して、どの値がアイテムの一意性を決定するかを指定することもできます。
1$unique = $collection->unique(function (array $item) { 2 return $item['brand'].$item['type']; 3}); 4 5$unique->values()->all(); 6 7/* 8 [ 9 ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],10 ['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],11 ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],12 ['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],13 ]14*/
uniqueメソッドは、アイテムの値をチェックするときに「緩やかな」比較を使用します。つまり、整数値を持つ文字列は、同じ値の整数と等しいと見なされます。「厳密な」比較を使用してフィルタリングするには、uniqueStrictメソッドを使用してください。
このメソッドの動作は、Eloquentコレクションを使用する場合に変更されます。
uniqueStrict()
このメソッドはuniqueメソッドと同じシグネチャを持っています。ただし、すべての値は「厳密な」比較を使用して比較されます。
unless()
unlessメソッドは、メソッドに渡された最初の引数がtrueと評価されない限り、指定したコールバックを実行します。
1$collection = collect([1, 2, 3]); 2 3$collection->unless(true, function (Collection $collection) { 4 return $collection->push(4); 5}); 6 7$collection->unless(false, function (Collection $collection) { 8 return $collection->push(5); 9});10 11$collection->all();12 13// [1, 2, 3, 5]
unlessメソッドに2番目のコールバックを渡すことができます。2番目のコールバックは、unlessメソッドに渡された最初の引数がtrueと評価されたときに実行されます。
1$collection = collect([1, 2, 3]); 2 3$collection->unless(true, function (Collection $collection) { 4 return $collection->push(4); 5}, function (Collection $collection) { 6 return $collection->push(5); 7}); 8 9$collection->all();10 11// [1, 2, 3, 5]
unlessの逆については、whenメソッドを参照してください。
unlessEmpty()
whenNotEmptyメソッドのエイリアスです。
unlessNotEmpty()
whenEmptyメソッドのエイリアスです。
unwrap()
静的なunwrapメソッドは、該当する場合、指定した値からコレクションの基になるアイテムを返します。
1Collection::unwrap(collect('John Doe')); 2 3// ['John Doe'] 4 5Collection::unwrap(['John Doe']); 6 7// ['John Doe'] 8 9Collection::unwrap('John Doe');10 11// 'John Doe'
value()
valueメソッドは、コレクションの最初の要素から指定した値を取得します。
1$collection = collect([2 ['product' => 'Desk', 'price' => 200],3 ['product' => 'Speaker', 'price' => 400],4]);5 6$value = $collection->value('price');7 8// 200
values()
valuesメソッドは、キーが連続した整数にリセットされた新しいコレクションを返します。
1$collection = collect([ 2 10 => ['product' => 'Desk', 'price' => 200], 3 11 => ['product' => 'Desk', 'price' => 200], 4]); 5 6$values = $collection->values(); 7 8$values->all(); 9 10/*11 [12 0 => ['product' => 'Desk', 'price' => 200],13 1 => ['product' => 'Desk', 'price' => 200],14 ]15*/
when()
whenメソッドは、メソッドに渡された最初の引数がtrueと評価されたときに、指定したコールバックを実行します。コレクションインスタンスとwhenメソッドに渡された最初の引数がクロージャに提供されます。
1$collection = collect([1, 2, 3]); 2 3$collection->when(true, function (Collection $collection, int $value) { 4 return $collection->push(4); 5}); 6 7$collection->when(false, function (Collection $collection, int $value) { 8 return $collection->push(5); 9});10 11$collection->all();12 13// [1, 2, 3, 4]
whenメソッドに2番目のコールバックを渡すことができます。2番目のコールバックは、whenメソッドに渡された最初の引数がfalseと評価されたときに実行されます。
1$collection = collect([1, 2, 3]); 2 3$collection->when(false, function (Collection $collection, int $value) { 4 return $collection->push(4); 5}, function (Collection $collection) { 6 return $collection->push(5); 7}); 8 9$collection->all();10 11// [1, 2, 3, 5]
whenの逆については、unlessメソッドを参照してください。
whenEmpty()
whenEmptyメソッドは、コレクションが空のときに指定したコールバックを実行します。
1$collection = collect(['Michael', 'Tom']); 2 3$collection->whenEmpty(function (Collection $collection) { 4 return $collection->push('Adam'); 5}); 6 7$collection->all(); 8 9// ['Michael', 'Tom']10 11$collection = collect();12 13$collection->whenEmpty(function (Collection $collection) {14 return $collection->push('Adam');15});16 17$collection->all();18 19// ['Adam']
whenEmptyメソッドに2番目のクロージャを渡すことができ、これはコレクションが空でないときに実行されます。
1$collection = collect(['Michael', 'Tom']); 2 3$collection->whenEmpty(function (Collection $collection) { 4 return $collection->push('Adam'); 5}, function (Collection $collection) { 6 return $collection->push('Taylor'); 7}); 8 9$collection->all();10 11// ['Michael', 'Tom', 'Taylor']
whenEmptyの逆については、whenNotEmptyメソッドを参照してください。
whenNotEmpty()
whenNotEmptyメソッドは、コレクションが空でないときに指定したコールバックを実行します。
1$collection = collect(['michael', 'tom']); 2 3$collection->whenNotEmpty(function (Collection $collection) { 4 return $collection->push('adam'); 5}); 6 7$collection->all(); 8 9// ['michael', 'tom', 'adam']10 11$collection = collect();12 13$collection->whenNotEmpty(function (Collection $collection) {14 return $collection->push('adam');15});16 17$collection->all();18 19// []
whenNotEmptyメソッドに2番目のクロージャを渡すことができ、これはコレクションが空のときに実行されます。
1$collection = collect(); 2 3$collection->whenNotEmpty(function (Collection $collection) { 4 return $collection->push('adam'); 5}, function (Collection $collection) { 6 return $collection->push('taylor'); 7}); 8 9$collection->all();10 11// ['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 8$filtered = $collection->where('price', 100); 9 10$filtered->all();11 12/*13 [14 ['product' => 'Chair', 'price' => 100],15 ['product' => 'Door', 'price' => 100],16 ]17*/
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 7$filtered = $collection->where('deleted_at', '!=', null); 8 9$filtered->all();10 11/*12 [13 ['name' => 'Jim', 'deleted_at' => '2019-01-01 00:00:00'],14 ['name' => 'Sally', 'deleted_at' => '2019-01-02 00:00:00'],15 ]16*/
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 9$filtered = $collection->whereBetween('price', [100, 200]);10 11$filtered->all();12 13/*14 [15 ['product' => 'Desk', 'price' => 200],16 ['product' => 'Bookcase', 'price' => 150],17 ['product' => 'Door', 'price' => 100],18 ]19*/
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 8$filtered = $collection->whereIn('price', [150, 200]); 9 10$filtered->all();11 12/*13 [14 ['product' => 'Desk', 'price' => 200],15 ['product' => 'Bookcase', 'price' => 150],16 ]17*/
whereInメソッドは、アイテムの値をチェックするときに「緩やかな」比較を使用します。つまり、整数値を持つ文字列は、同じ値の整数と等しいと見なされます。「厳密な」比較を使用してフィルタリングするには、whereInStrictメソッドを使用してください。
whereInStrict()
このメソッドはwhereInメソッドと同じシグネチャを持っています。ただし、すべての値は「厳密な」比較を使用して比較されます。
whereInstanceOf()
whereInstanceOfメソッドは、特定のクラスタイプでコレクションをフィルタリングします。
1use App\Models\User; 2use App\Models\Post; 3 4$collection = collect([ 5 new User, 6 new User, 7 new Post, 8]); 9 10$filtered = $collection->whereInstanceOf(User::class);11 12$filtered->all();13 14// [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 9$filtered = $collection->whereNotBetween('price', [100, 200]);10 11$filtered->all();12 13/*14 [15 ['product' => 'Chair', 'price' => 80],16 ['product' => 'Pencil', 'price' => 30],17 ]18*/
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 8$filtered = $collection->whereNotIn('price', [150, 200]); 9 10$filtered->all();11 12/*13 [14 ['product' => 'Chair', 'price' => 100],15 ['product' => 'Door', 'price' => 100],16 ]17*/
whereNotInメソッドは、アイテムの値をチェックするときに「緩やかな」比較を使用します。つまり、整数値を持つ文字列は、同じ値の整数と等しいと見なされます。「厳密な」比較を使用してフィルタリングするには、whereNotInStrictメソッドを使用してください。
whereNotInStrict()
このメソッドはwhereNotInメソッドと同じシグネチャを持っています。ただし、すべての値は「厳密な」比較を使用して比較されます。
whereNotNull()
whereNotNullメソッドは、指定したキーがnullでないアイテムをコレクションから返します。
1$collection = collect([ 2 ['name' => 'Desk'], 3 ['name' => null], 4 ['name' => 'Bookcase'], 5]); 6 7$filtered = $collection->whereNotNull('name'); 8 9$filtered->all();10 11/*12 [13 ['name' => 'Desk'],14 ['name' => 'Bookcase'],15 ]16*/
whereNull()
whereNullメソッドは、指定したキーがnullであるアイテムをコレクションから返します。
1$collection = collect([ 2 ['name' => 'Desk'], 3 ['name' => null], 4 ['name' => 'Bookcase'], 5]); 6 7$filtered = $collection->whereNull('name'); 8 9$filtered->all();10 11/*12 [13 ['name' => null],14 ]15*/
wrap()
静的なwrapメソッドは、該当する場合、指定した値をコレクションでラップします。
1use Illuminate\Support\Collection; 2 3$collection = Collection::wrap('John Doe'); 4 5$collection->all(); 6 7// ['John Doe'] 8 9$collection = Collection::wrap(['John Doe']);10 11$collection->all();12 13// ['John Doe']14 15$collection = Collection::wrap(collect('John Doe'));16 17$collection->all();18 19// ['John Doe']
zip()
zipメソッドは、指定した配列の値を、元のコレクションの値と対応するインデックスでマージします。
1$collection = collect(['Chair', 'Desk']);2 3$zipped = $collection->zip([100, 200]);4 5$zipped->all();6 7// [['Chair', 100], ['Desk', 200]]
高階メッセージ
コレクションは「高階メッセージ」のサポートも提供しており、これはコレクションで一般的なアクションを実行するためのショートカットです。高階メッセージを提供するコレクションメソッドは、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高階メッセージを使用して、コレクション内の各オブジェクトでメソッドを呼び出してみましょう。
1use App\Models\User;2 3$users = User::where('votes', '>', 500)->get();4 5$users->each->markAsVip();
同様に、sum高階メッセージを使用して、ユーザーのコレクションの「投票」の総数を収集できます。
1$users = User::where('group', 'Development')->get();2 3return $users->sum->votes;
遅延コレクション
イントロダクション
Laravelの遅延コレクションについて詳しく学ぶ前に、PHPジェネレータに慣れておきましょう。
すでに強力なCollectionクラスを補完するために、LazyCollectionクラスはPHPのジェネレータを活用して、メモリ使用量を低く抑えながら非常に大きなデータセットを操作できるようにします。
たとえば、アプリケーションが数ギガバイトのログファイルを処理する必要があり、Laravelのコレクションメソッドを活用してログを解析する必要があるとします。ファイル全体を一度にメモリに読み込む代わりに、遅延コレクションを使用して、特定の時間にファイルのほんの一部だけをメモリに保持できます。
1use App\Models\LogEntry; 2use Illuminate\Support\LazyCollection; 3 4LazyCollection::make(function () { 5 $handle = fopen('log.txt', 'r'); 6 7 while (($line = fgets($handle)) !== false) { 8 yield $line; 9 }10})->chunk(4)->map(function (array $lines) {11 return LogEntry::fromLines($lines);12})->each(function (LogEntry $logEntry) {13 // Process the log entry...14});
あるいは、10,000のEloquentモデルを反復処理する必要があるとします。従来のLaravelコレクションを使用する場合、10,000のEloquentモデルすべてを同時にメモリにロードする必要があります。
1use App\Models\User;2 3$users = User::all()->filter(function (User $user) {4 return $user->id > 500;5});
しかし、クエリビルダのcursorメソッドはLazyCollectionインスタンスを返します。これにより、データベースに対して単一のクエリのみを実行しつつ、一度に1つのEloquentモデルのみをメモリにロードしたままにできます。この例では、filterコールバックは、各ユーザーを個別に反復処理するまで実行されないため、メモリ使用量が大幅に削減されます。
1use App\Models\User;2 3$users = User::cursor()->filter(function (User $user) {4 return $user->id > 500;5});6 7foreach ($users as $user) {8 echo $user->id;9}
遅延コレクションの生成
遅延コレクションインスタンスを作成するには、コレクションのmakeメソッドにPHPジェネレータ関数を渡す必要があります。
1use Illuminate\Support\LazyCollection;2 3LazyCollection::make(function () {4 $handle = fopen('log.txt', 'r');5 6 while (($line = fgets($handle)) !== false) {7 yield $line;8 }9});
Enumerable契約
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クラスでは利用できません。
遅延コレクションのメソッド
Enumerable契約で定義されているメソッドに加えて、LazyCollectionクラスには次のメソッドが含まれています。
takeUntilTimeout()
takeUntilTimeoutメソッドは、指定した時間まで値を列挙する新しい遅延コレクションを返します。その時間が経過すると、コレクションは列挙を停止します。
1$lazyCollection = LazyCollection::times(INF) 2 ->takeUntilTimeout(now()->addMinute()); 3 4$lazyCollection->each(function (int $number) { 5 dump($number); 6 7 sleep(1); 8}); 9 10// 111// 212// ...13// 5814// 59
このメソッドの使用法を説明するために、カーソルを使用してデータベースから請求書を送信するアプリケーションを想像してください。スケジュールされたタスクを15分ごとに実行するように定義し、最大14分間のみ請求書を処理するようにできます。
1use App\Models\Invoice;2use Illuminate\Support\Carbon;3 4Invoice::pending()->cursor()5 ->takeUntilTimeout(6 Carbon::createFromTimestamp(LARAVEL_START)->add(14, 'minutes')7 )8 ->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 6// Three items are dumped... 7$array = $lazyCollection->take(3)->all(); 8 9// 110// 211// 3
throttle()
throttleメソッドは、遅延コレクションをスロットルし、各値が指定された秒数後に返されるようにします。このメソッドは、着信リクエストをレート制限する可能性のある外部APIと対話する状況で特に役立ちます。
1use App\Models\User;2 3User::where('vip', true)4 ->cursor()5 ->throttle(seconds: 1)6 ->each(function (User $user) {7 // Call external API...8 });
remember()
rememberメソッドは、すでに列挙された値を記憶し、後続のコレクションの列挙でそれらを再度取得しない新しい遅延コレクションを返します。
1// No query has been executed yet... 2$users = User::cursor()->remember(); 3 4// The query is executed... 5// The first 5 users are hydrated from the database... 6$users->take(5)->all(); 7 8// First 5 users come from the collection's cache... 9// The rest are hydrated from the database...10$users->take(20)->all();