サーチ…
構文
- $ collection = collect(['Value1'、 'Value2'、 'Value3']); //キーのデフォルトは0,1,2、...、
備考
Illuminate\Support\Collection
は、データの配列を扱うための流暢かつ便利なインターフェイスを提供します。たとえば、複数のレコードを取得するモデルクエリでは、 Illuminate\Support\Collection
インスタンスが返されます。
コレクションに関する最新のドキュメントについては、公式のドキュメントをここで見つけることができます
コレクションを作成する
collect()
ヘルパーを使用すると、次のような配列を渡すことで簡単に新しいコレクションインスタンスを作成できます。
$fruits = collect(['oranges', 'peaches', 'pears']);
ヘルパー関数を使用したくない場合は、クラスを直接使用して新しいコレクションを作成できます。
$fruits = new Illuminate\Support\Collection(['oranges', 'peaches', 'pears']);
備考で述べたように、モデルはデフォルトでCollection
インスタンスを返しますが、必要に応じて独自のコレクションを自由に作成できます。作成時に配列が指定されていない場合、空のCollectionが作成されます。
ここで、()
コレクションから特定のアイテムを選択するには、 where()
メソッドを使用します。
$data = [
['name' => 'Taylor', 'coffee_drinker' => true],
['name' => 'Matt', 'coffee_drinker' => true]
];
$matt = collect($data)->where('name', 'Matt');
このコードは、名前が「Matt」のコレクションからすべてのアイテムを選択します。この場合、2番目の項目のみが返されます。
ネスティング
Laravelのほとんどの配列メソッドと同様にwhere()
はネストされた要素の検索もサポートしています。上の例を2番目の配列を追加して拡張しましょう:
$data = [
['name' => 'Taylor', 'coffee_drinker' => ['at_work' => true, 'at_home' => true]],
['name' => 'Matt', 'coffee_drinker' => ['at_work' => true, 'at_home' => false]]
];
$coffeeDrinkerAtHome = collect($data)->where('coffee_drinker.at_home', true);
これは彼が自宅でコーヒーを飲むので、テイラーだけを返すでしょう。ご覧のように、ネスティングはドット表記を使用してサポートされています。
追加
配列ではなくオブジェクトのCollectionを作成する場合は、 where()
も使用してフィルタリングできます。コレクションは、次に、すべての望ましいプロパティを受け取ろうとします。
Laravel 5.3以降、 where()
メソッドはデフォルトで値を緩やかに比較しようとします。つまり、 (int)1
検索すると、 '1'
を含むすべてのエントリも同様に返されます。その動作が気に入らない場合は、 whereStrict()
メソッドを使用できます。
Getを使用して値を参照するか、デフォルトを返す
あなたは、変数に対応する価値を見つける必要がある状況に遭遇することがよくあります。
以下の例では、配列内に3つの異なるロケールがあり、対応する呼び出しコードが割り当てられています。私たちはロケールを提供できるようにしたいが、その代わりに関連する呼び出しコードを取得する。最初のパラメータが見つからない場合、 get
の2番目のパラメータはデフォルトのパラメータです。
function lookupCallingCode($locale)
{
return collect([
'de_DE' => 49,
'en_GB' => 44,
'en_US' => 1,
])->get($locale, 44);
}
上記の例では、以下を行うことができます
lookupCallingCode('de_DE'); // Will return 49
lookupCallingCode('sv_SE'); // Will return 44
コールバックをデフォルト値として渡すことさえできます。指定されたキーが存在しない場合、コールバックの結果が返されます。
return collect([
'de_DE' => 49,
'en_GB' => 44,
'en_US' => 1,
])->get($locale, function() {
return 44;
});
Containsを使用して、コレクションが特定の条件を満たすかどうかをチェックします。
一般的な問題は、すべてが特定の基準を満たす必要があるアイテムのコレクションを持つことです。下の例では、食事プランの2つのアイテムを収集しました。このダイエットに不健康な食物が含まれていないことを確認したいと考えています。
// First we create a collection
$diet = collect([
['name' => 'Banana', 'calories' => '89'],
['name' => 'Chocolate', 'calories' => '546']
]);
// Then we check the collection for items with more than 100 calories
$isUnhealthy = $diet->contains(function ($i, $snack) {
return $snack["calories"] >= 100;
});
上記の場合、 $isUnhealthy
変数はチョコレートが条件を満たすのでtrue
に設定され、したがって食事は健康ではありません。
特定の値をコレクションから抽出するためにPluckを使用する
あなたはしばしば、データの一部だけに興味があるデータの集まりを見つけるでしょう。
下の例では、イベントの参加者のリストを取得しました。ツアーガイドに簡単な名前リストを提供したいと考えています。
// First we collect the participants
$participants = collect([
['name' => 'John', 'age' => 55],
['name' => 'Melissa', 'age' => 18],
['name' => 'Bob', 'age' => 43],
['name' => 'Sara', 'age' => 18],
]);
// Then we ask the collection to fetch all the names
$namesList = $partcipants->pluck('name')
// ['John', 'Melissa', 'Bob', 'Sara'];
オブジェクトのコレクションやドット表記のネストされた配列/オブジェクトの収集には、 pluck
を使用することもできます。
$users = User::all(); // Returns Eloquent Collection of all users
$usernames = $users->pluck('username'); // Collection contains only user names
$users->load('profile'); // Load a relationship for all models in collection
// Using dot notation, we can traverse nested properties
$names = $users->pluck('profile.first_name'); // Get all first names from all user profiles
Mapを使用してコレクション内の各要素を操作する
多くの場合、一連のデータ構造を変更して特定の値を操作する必要があります。
下の例では、割引額が添付された書籍のコレクションを入手しました。しかし、私たちはむしろすでに値引きされている書籍のリストを持っています。
$books = [
['title' => 'The Pragmatic Programmer', 'price' => 20, 'discount' => 0.5],
['title' => 'Continuous Delivery', 'price' => 25, 'discount' => 0.1],
['title' => 'The Clean Coder', 'price' => 10, 'discount' => 0.75],
];
$discountedItems = collect($books)->map(function ($book) {
return ['title' => $book["title"], 'price' => $book["price"] * $book["discount"]];
});
//[
// ['title' => 'The Pragmatic Programmer', 'price' => 10],
// ['title' => 'Continuous Delivery', 'price' => 12.5],
// ['title' => 'The Clean Coder', 'price' => 5],
//]
これはまた、キーを変更するために使用することもできます。これは、キーtitle
を適切な解決策にするname
に変更したいとします。
コレクションの合計、平均、最小または最大を統計計算に使用する
また、コレクションを使用すると、簡単な統計計算を簡単に行うことができます。
$books = [
['title' => 'The Pragmatic Programmer', 'price' => 20],
['title' => 'Continuous Delivery', 'price' => 30],
['title' => 'The Clean Coder', 'price' => 10],
]
$min = collect($books)->min('price'); // 10
$max = collect($books)->max('price'); // 30
$avg = collect($books)->avg('price'); // 20
$sum = collect($books)->sum('price'); // 60
コレクションの並べ替え
コレクションをソートするには、いくつかの方法があります。
ソート()
sort
メソッドは、コレクションをソートします。
$collection = collect([5, 3, 1, 2, 4]);
$sorted = $collection->sort();
echo $sorted->values()->all();
returns : [1, 2, 3, 4, 5]
sort
メソッドを使用すると、独自のアルゴリズムでカスタムコールバックを渡すこともできます。フードの下でソートはusort
ソートを使用します。
$collection = $collection->sort(function ($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
});
並び替え()
sortBy
メソッドは、コレクションを指定されたキーでソートします。
$collection = collect([
['name' => 'Desk', 'price' => 200],
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
]);
$sorted = $collection->sortBy('price');
echo $sorted->values()->all();
returns: [
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
['name' => 'Desk', 'price' => 200],
]
sortBy
メソッドを使用すると、多次元配列をソートするためにドット表記形式を使用してより深いキーにアクセスできます。
$collection = collect([
["id"=>1,"product"=>['name' => 'Desk', 'price' => 200]],
["id"=>2, "product"=>['name' => 'Chair', 'price' => 100]],
["id"=>3, "product"=>['name' => 'Bookcase', 'price' => 150]],
]);
$sorted = $collection->sortBy("product.price")->toArray();
return: [
["id"=>2, "product"=>['name' => 'Chair', 'price' => 100]],
["id"=>3, "product"=>['name' => 'Bookcase', 'price' => 150]],
["id"=>1,"product"=>['name' => 'Desk', 'price' => 200]],
]
SortByDesc()
このメソッドは、 sortBy
メソッドと同じシグネチャを持ちますが、逆の順序でコレクションをソートします。
reduce()を使用すると、
reduce
メソッドは、コレクションを単一の値に減らし、各反復の結果を後続の反復に渡します。 reduceメソッドを参照してください。
reduce
メソッドは、各アイテムをコレクションでループし、次の繰り返しに新しい結果を生成します。最後の反復からの各結果は、最初のパラメータ(次の例では、 $carry
として渡されます)に渡されます。
この方法は、大きなデータセットに対して多くの処理を行うことができます。たとえば、次の例では、学生データの例を使用します。
$student = [
['class' => 'Math', 'score' => 60],
['class' => 'English', 'score' => 61],
['class' => 'Chemistry', 'score' => 50],
['class' => 'Physics', 'score' => 49],
];
学生の総得点の合計
$sum = collect($student)
->reduce(function($carry, $item){
return $carry + $item["score"];
}, 0);
結果: 220
説明:
-
$carry
は最後の反復の結果です。 - 2番目のパラメータは、1回目の繰り返しでの$ carryのデフォルト値です。この場合、デフォルト値は0です
すべての得点が50以上の場合、生徒を渡す
$isPass = collect($student)
->reduce(function($carry, $item){
return $carry && $item["score"] >= 50;
}, true);
結果: false
説明:
- $ carryのデフォルト値はtrueです
- すべてのスコアが50より大きい場合、結果はtrueを返します。 50未満の場合はfalseを返します。
いずれかのスコアが50未満の場合、生徒を不合格にする
$isFail = collect($student)
->reduce(function($carry, $item){
return $carry || $item["score"] < 50;
}, false);
結果: true
説明:
- $ carryのデフォルト値はfalseです。
- スコアが50未満の場合はtrueを返します。すべてのスコアが50より大きい場合はfalseを返します。
最高得点を返す対象
$highestSubject = collect($student)
->reduce(function($carry, $item){
return $carry === null || $item["score"] > $carry["score"] ? $item : $carry;
});
結果: [ "subject" => "English", "score" => 61 ]
説明:
この場合、2番目のパラメータは提供されません。
$ carryのデフォルト値はnullなので、私たちは条件付きでそれをチェックします。
マクロ()を使ってコレクションを拡張する
macro()
関数を使用すると、 Illuminate\Support\Collection
オブジェクトに新しい機能を追加できます
使用法:
Collection::macro("macro_name", function ($parameters) {
// Your macro
});
例えば:
Collection::macro('uppercase', function () {
return $this->map(function ($item) {
return strtoupper($item);
});
});
collect(["hello", "world"])->uppercase();
結果: ["HELLO", "WORLD"]
配列構文の使用
Collection
オブジェクトはArrayAccess
およびIteratorAggregate
インターフェイスをArrayAccess
し、配列のように使用できます。
アクセスコレクション要素:
$collection = collect([1, 2, 3]);
$result = $collection[1];
結果: 2
新しい要素を割り当てる:
$collection = collect([1, 2, 3]);
$collection[] = 4;
結果: $collection
は[1, 2, 3, 4]
ループコレクション:
$collection = collect(["a" => "one", "b" => "two"]);
$result = "";
foreach($collection as $key => $value){
$result .= "(".$key.": ".$value.") ";
}
結果: $result
は(a: one) (b: two)
配列からコレクションへの変換:
コレクションをネイティブのPHP配列に変換するには、以下を使用します。
$array = $collection->all();
//or
$array = $collection->toArray()
配列をコレクションに変換するには、以下を使用します。
$collection = collect($array);
配列関数によるコレクションの使用
コレクションは、 array_map($callback)
ような、明示的に配列を必要とする関数によって使用された場合、正しく変換されない通常のオブジェクトであることに注意してください。
コレクションを最初に変換するか、または可能であればCollection
クラスが提供するメソッドを使用してください。 $collection->map($callback)