Laravel collectionの使い方【初心者向け】
この記事ではLaravel Collectionについて解説していきます。
Collectionとは名前どおり、複数個ある何かを格納するための入れ物です。Laravelに用意されているCollectionは、リスト形式でデータを格納できます。Collectionクラスには多様なメソッドがあり、数行書く必要があった処理をほんの2~3行で書くことができます。
そんな便利なCollectionについて、詳しく見ていきましょう。
Laravel Collectionとは
Laravel Collectionとは、リスト形式でデータを格納できるラッパーのことを指します。またCollectionは配列とは異なり、Collection自身を操作できるメソッドを持っています。Laravelのようなフレームワークでは、ORマッパーを使用することも相まって、オブジェクト単位でデータを管理する機会がたくさんあります。そのためLaravel Collectionのようなリストが、データ管理のときにとても役立ちます。
Collectionの基本的な使い方ですが、以下のように使います。
なお、今回使うバージョンは5.5のため、他のバージョンでは挙動が異なる可能性があります。
// コレクションの作成
$collection = collect([11, 22, 33]);
Collectionを配列に変換する方法
Collectionを配列に変換するには、toArrayメソッドを使います。
サンプルコードは以下のとおりです。単純にCollectionからtoArrayメソッドを引数なしで呼び出すだけです。
$collection = collect([
['title' => 'ベニスの商人', 'author' => 'シェイクスピア', 'price' => 2000],
['title' => '罪と罰', 'author' => 'ドストエフスキー', 'price' => 1500],
]);
print_r($collection->toArray());
/* 実行結果 */
Array ( [0] => Array ( [title] => ベニスの商人 [author] => シェイクスピア [price] => 2000 ) [1] => Array ( [title] => 罪と罰 [author] => ドストエフスキー [price] => 1500 ) )
またtoArrayはCollection内でネストしているオブジェクトも、すべて配列に変換します。
Collectionをsortする方法
Collectionのデータを並び変えるには、sortメソッドを使用します。
$collection = collect([100, 50, 9000, 120, 180000]);
$sorted = $collection->sort();
print_r($sorted->values()->all());
/* 実行結果 */
Array ( [0] => 50 [1] => 100 [2] => 120 [3] => 9000 [4] => 180000 )
ただし、オブジェクトを格納したCollectionをソートする場合は、sortByまたはsortByDescを使う必要があります。また、sortBy、sortByDedcメソッドを利用する場合は、Collectionのコールバック関数の引数にキーを渡して使います。
$collection = collect([
['title' => 'ベニスの商人', 'author' => 'シェイクスピア', 'price' => 2000],
['title' => '罪と罰', 'author' => 'ドストエフスキー', 'price' => 1500],
]);
$sorted = $collection->sortBy('price');
print_r($sorted->values()->all());
/* 実行結果 */
Array ( [0] => Array ( [title] => 罪と罰 [author] => ドストエフスキー [price] => 1500 ) [1] => Array ( [title] => ベニスの商人 [author] => シェイクスピア [price] => 2000 ) )
$sorted = $collection->sortByDesc('price');
print_r($sorted->values()->all());
/* 実行結果 */
Array ( [0] => Array ( [title] => ベニスの商人 [author] => シェイクスピア [price] => 2000 ) [1] => Array ( [title] => 罪と罰 [author] => ドストエフスキー [price] => 1500 ) )
Collectionの要素をひとつずつ取り出す方法
Collectionの要素をひとつずつ取り出すには、eachメソッドが便利です。さらにeachメソッドから取り出したCollectionの要素を、そのままコールバック内で記述した処理にかけることができます。each内にあるCollection内の個別の要素すべてを、特定の処理にかけたいときに便利です。
下のサンプルでは15以下の要素を取り出し、それぞれの値に4を加算しています。
$collection = collect([1, 5, 10, 15, 20]);
$result = $collection->each(function ($item) {
if ($item < 15) {
echo $item + 4;
echo '<br>';
}
});
/* 実行結果 */
5
9
14
Collectionの要素にフィルターをかける方法
Collectionのfilterメソッドを使うことで、条件に合った要素だけを取り出すこともできます。下のサンプルではCollectionの中にある数字のうち、150未満のものだけをfilterメソッドで抽出します。
$collection = collect([100, 50, 9000, 120, 180000]);
$filtered = $collection->filter(function ($value, $key) {
return $value < 150;
});
print_r($filtered->all());
/* 実行結果 */
Array ( [0] => 100 [1] => 50 [3] => 120 )
またfilterメソッドに何も渡さずに実行すると、PHP上でfalseと判定されるものを自動的に削除したものを返します。下のサンプルだとnull、false、”、0、[] がfalse扱いとなるため、trueと100のみのCollectionを返します。
$collection = collect([null, false, '', 0, [], true, 100]);
print_r($collection->filter()->all());
/* 実行結果 */
Array ( [5] => 1 [6] => 100 )
Collectionの各要素に関数を適用する方法
Collectionに格納されているすべての要素に、同じ処理をかけるにはmapメソッドを使います。
mapで要素を処理した場合、新しいCollectionが生成されます。そのため、mapメソッドで処理する前のCollectionは、変更されません。サンプルコードでは作成済みのCollectionが持つすべての要素に3をかけ、べつの新しいCollectionを生成しています。
$collection = collect([7, 97, 997, 9997, 99997]);
$multiplied = $collection->map(function ($item, $key) {
return $item + 3;
});
echo '$collection:';
print_r($collection->all());
echo '<br>';
echo '$multiplied:';
print_r($multiplied->all());
/* 実行結果 */
$collection:Array ( [0] => 7 [1] => 97 [2] => 997 [3] => 9997 [4] => 99997 )
$multiplied:Array ( [0] => 10 [1] => 100 [2] => 1000 [3] => 10000 [4] => 100000 )
Collectionのキーを指定して値を取り出す方法
pluckメソッドを使うことで、キーバリューストア形式のCollectionであれば、指定したキーにあたるバリューをすべて取得できます。以下の例だとCollection内にあるtitleキーのバリューを、pluckメソッドで抜き出しています。
$collection = collect([
['title' => 'ベニスの商人', 'author' => 'シェイクスピア', 'price' => 2000],
['title' => 'リア王', 'author' => 'シェイクスピア', 'price' => 1000],
['title' => 'ロミオとジュリエット', 'author' => 'シェイクスピア', 'price' => 1200],
['title' => '罪と罰', 'author' => 'ドストエフスキー', 'price' => 1500],
['title' => 'カラマーゾフの兄弟', 'author' => 'ドストエフスキー', 'price' => 1800],
['title' => '悪霊', 'author' => 'ドストエフスキー', 'price' => 1100],
]);
$plucked = $collection->pluck('title');
print_r($plucked->all());
/* 実行結果 */
Array ( [0] => ベニスの商人 [1] => リア王 [2] => ロミオとジュリエット [3] => 罪と罰 [4] => カラマーゾフの兄弟 [5] => 悪霊 )
また、pluckメソッドではキー項目も指定することも可能で、あるCollectionのバリューから新たなキーバリューを作り出すこともできます。サンプルではもともとのCollectionから、titleとpriceのバリューを抜き出して、新たなキーバリューストアのデータを形成しています。
$plucked = $collection->pluck('price', 'title');
print_r($plucked->all());
/* 実行結果 */
Array ( [ベニスの商人] => 2000 [リア王] => 1000 [ロミオとジュリエット] => 1200 [罪と罰] => 1500 [カラマーゾフの兄弟] => 1800 [悪霊] => 1100 )
まとめ
Laravel Collectionに用意されている、6つのメソッドをご紹介しました。
- toArray:Collectionから配列に変換する
- sort:Collection要素の順番を並び替える
- each:Collection要素を取り出し、コールバックに引き渡す
- filter:特定の条件に合致するCollection要素を抽出する
- map:Collection要素すべてに、一律で処理を加える
- pluck:Collection要素にあるKeyを使ってValueを抽出する、
これらを覚えるだけでも、Laravelにおけるデータ操作が楽になります。またここにあるメソッドはごく一部ですので、本家のドキュメントを見ることをオススメします。ぜひCollectionを覚えて、Laravelによる開発力をグッと上げましょう。