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