Laravel collectionの使い方【初心者向け】

プログラミング
Laravel Collectionとはリスト形式でデータを格納できるラッパーであること、またCollectionの作成方法を解説します。さらにCollectionに用意されているいくつかのメソッドについて、サンプルコードを用いて説明を行います。今回説明するCollectionのメソッドは、toArray、sort、each、filter、map、pluckの6つです。
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による開発力をグッと上げましょう。

この記事のキーワードに関する勉強会・イベントを探す

TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。


おすすめのコラム