LaravelのCollection使い方まとめ(追加/削除/含むかなど)

Laravel Laravel

LaravelのCollectionの使い方についてまとめています。
Collectionについて、簡単な解説と下記のメソッドを使ってみています。

・get
・all
・add
・push
・put
・where
・filter
・map
・each
・count
・contains

載せているコードについては、Laravelのバージョン10で動作確認しました。

LaravelのCollectionとは?

Laravelの基本機能としてIlluminateSupportCollectionに配置されています。
配列を使いやすくするラッパークラスのようです。

collectヘルパーを使うか、Collectionクラスからインスタンス化して使うことができます。
Collectionクラスをnewして使う場合には、Illuminate\Support\Collectionをuseするようにしてください。

Collectionを使うことで、ソートや条件をつけたデータ取得などの配列操作を簡単に行うことができるようになります。

公式のドキュメントはこちらに配置されています。
この記事で紹介しているメソッド以外にも載っているので、一度確認しておくと良いかと思います。

Collectionの使い方

コレクションの基本的な使い方についてです。

Collectionを作成する

このようにして、コレクションを作ることができます。

$collect = collect();

dd($collect);

ddで出力すると、下記のようにコレクションのインスタンスになりました。

Illuminate\Support\Collection {#297 ▼
  #items: []
  #escapeWhenCastingToString: false
}

配列からCollectionを作成する

配列を初期値として、コレクションを作ることもできます。

 $collect = collect(['aaa', 123, true]);
 dd($collect);

ddで出力すると、itemsプロパティに配列がセットされています。

Illuminate\Support\Collection {#297 ▼
  #items: array:3 [▼
    0 => "aaa"
    1 => 123
    2 => true
  ]
  #escapeWhenCastingToString: false
}

連想配列やクラスからCollectionを作成する

連想配列やクラスを初期値として設定して、コレクションを作ることもできます。

$collect = collect([
    'aaa' => 'bbb',
    'hoge' => 'fuga',
    new Collection(['hoge' => 'fuga'])
]);
dd($collect);

ddで出力してみました。
連想配列とコレクションのインスタンスがitemsプロパティに設定されました。

Illuminate\Support\Collection {#288 ▼
  #items: array:3 [▼
    "aaa" => "bbb"
    "hoge" => "fuga"
    0 => Illuminate\Support\Collection {#299 ▼
      #items: array:1 [▶]
      #escapeWhenCastingToString: false
    }
  ]
  #escapeWhenCastingToString: false
}

Collectionの値を取得する

allメソッドを使うと、コレクションの値を全て取得することができます。

$collect = collect(['apple', 777, true]);
dd($collect->all());

ddで出力すると、下記のように配列が取得できました。

array:3 [▼
  0 => "apple"
  1 => 777
  2 => true
]

ひとつだけとりたいときには、getメソッドを使って、要素番号を指定して取ることができます。
連想配列の場合にはキーを指定すると良いです。

$collect = collect(['apple', 777, true]);

dd($collect->get(1)); // 777

ループして全ての値を取得する

配列と同じようにコレクションをもとにループすることができます。

$fruits = collect(['apple', 'grape', 'lemon']);

foreach ($fruits as $fruit) {
    echo $fruit . " ";
}

$fruitsコレクションに3つの要素を入れています。
その後に、配列のようにforeachを使ってループしています。

結果を確認すると、下記のように出力されました。

apple grape lemon

最初のデータを取得する

最初の1番目を取得したいときには、firstメソッドが使えます。
値がなかったときには、nullになります。

$collect = collect(['apple', 777, true]);
dd($collect->first()); // apple

最後のデータを取得する

最後のデータを取得するときには、lastメソッドが使えます。
こちらも値がなかったときには、nullになります。

$collect = collect(['apple', 'banana', 'melon', 'orange', 'peach']);
dd($collect->last()); // peach

Collectionの値を追加する

コレクションに値を追加するにはaddメソッドを使うことができます。

$collect = collection();

$collect->add('apple');
$collect->add('banana');
$collect->add('lemon');

dd($collect->all());

$collectインスタンスを作って、addメソッドで渡したい要素を3つ追加しました。
結果、下記のように追加されたことが確認できました。

array:3 [▼
  0 => "apple"
  1 => "banana"
  2 => "lemon"
]

複数の値を追加したい

値を複数、一括で追加したいときにはpushメソッドを使うことができます。

$collect = collect();

$collect->push('apple');
$collect->push('peach', 'grape', 'melon');
$collect->push('lemon');

dd($collect->all());

$collectインスタンスからpushを呼んで、値を追加しています。
最初にappleを追加して、その後に「’peach’, ‘grape’, ‘melon’」と、3つをまとめて追加しました。

結果を確認すると、下記のようになりました。

array:5 [▼ 
  0 => "apple"
  1 => "peach"
  2 => "grape"
  3 => "melon"
  4 => "lemon"
]

値を上書きしたい

値をコレクションの上書きしたいときには、putメソッドを使うことができます。

$collect = collect(['apple', 'grape', 'melon']);

$collect->put(1, 'banana');
dd($collect->all());

Collectionのインスタンスからputメソッドを呼んで、1番目の要素をbananaで上書きました。
確認すると、下記のようになりました。

array:3 [▼
  0 => "apple"
  1 => "banana"
  2 => "melon"
]

このようにputメソッドの1番目のキーの値を上書きします。
キーの値がなければ追加されます。(連想配列でも同様に動作します)

Collectionの値を削除する

コレクションからpullメソッドを使うことで、値を削除することができます。

$collect = collect(['apple', 'grape', 'melon']);

$collect->pull(1);
dd($collect->all());

pullメソッドに削除したい、キーを指定しています。
1番目を削除したので、確認してみると、下記のようになりました。

array:2 [▼ 
  0 => "apple"
  2 => "melon"
]

Collectionで使いそうなメソッド6選

上記で紹介したメソッド以外にもコレクションを使うときに、よく使いそうなメソッドを6つ紹介しています。

必要なデータを探す(whereメソッド)

whereメソッドを使うと、条件をつけてコレクションから必要なデータを取得できます。

$fruits = collect([
    ['red' => 'apple'],
    ['yellow' => 'banana'],
    ['blue' => 'grape'],
]);

$fruits = $fruits->where('yellow');
dd($fruits->all());

$fruitsコレクションを作っています。
その後にwhereメソッドを呼び出して、取得したい「yellow」を指定しコレクションを返しました。

結果を確認すると、下記のようにひとつだけ取得できました。

array:1 [▼
  1 => array:1 [▼
    "yellow" => "banana"
  ]
]

フィルターをかけたい(filterメソッド)

filterメソッドを使うと、コレクションに入っているデータに対してフィルタリングして、必要な分だけ取り出すことができます。

$fruits = collect([
    ['red' => 'apple'],
    ['yellow' => 'banana'],
    ['blue' => 'grape'],
    ['white' => 'lychee'],
]);

$filtered = $fruits->filter(function (array $value) {
    return isset($value['yellow']) || isset($value['blue']);
});

dd($filtered);

コレクションからfilterメソッドを呼び出しています。
$value変数にコレクションの要素がひとつずつ入ってきて評価されます。

評価した結果、trueのデータのみ残って、コレクションとして返されます。
出力結果を確認すると、フィルタリングされたコレクションが返ってきました。

Illuminate\Support\Collection {#322 ▼
  #items: array:2 [▼
    1 => array:1 [▼
      "yellow" => "banana"
    ]
    2 => array:1 [▼
      "blue" => "grape"
    ]
  ]
  #escapeWhenCastingToString: false
}

コレクションを加工して返したい(mapメソッド)

mapメソッドを使うことで、コレクションの要素のひとつひとつに対して処理をすることができます。

$fruits = collect(['apple', 'banana', 'grape']);

$mapResult = $fruits->map(function (string $value) {
    return $value . "!!!";
});

dd($mapResult->all());

$fruitsコレクションを作成して、その後にmapメソッドを使っています。
それぞれの要素が$valueに設定されて処理されます。

要素にたいして、文字列の「!!!」を結合して返しました。
結果を確認すると、下記のように要素が加工されました。

array:3 [▼
  0 => "apple!!!"
  1 => "banana!!!"
  2 => "grape!!!"
]

コレクションの要素を元にループする(eachメソッド)

eachメソッドを使うと、コレクションの要素をもとにループ処理することができます。

$fruits = collect(['apple', 'banana', 'grape']);

$fruits->each(function (string $value, int $key) {
    echo "{$key}:{$value} ";
});

$fruitsコレクションを作成した後にeachメソッドを使っています。
$valueにはコレクションの要素、$keyにはキーが設定されます。

今回はechoで出力してみました。
結果を確認すると、下記のようになります。

0:apple 1:banana 2:grape

コレクションの要素数を取得する(countメソッド)

コレクションの要素数を数えるにはcountメソッドを使います。

$fruits = collect(['apple', 'banana', 'grape']);
dd($fruits->count());

コレクションを3つの要素で作成して、countメソッドで要素数を取得しています。
結果を確認すると、数値の「3」が返ってきました。

コレクションに値を含むか確認する(containsメソッド)

コレクションに値を含んでいるか確認するにはcontainsメソッドを使うと良いです。

$fruits = collect(['apple', 'grape', 'banana']);
dd($fruits->contains('grape')); // true

$fruitsコレクションからcontainsメソッドで「grape」が含まれるか確認しています。
含まれる場合はtrueが返ってきて、含まない場合にはfalseになります。

今回は含まれているのでtrueが返ってきます。

コメント

  1. 新人プログラマー より:

    「$collection->add()する」の部分で、

    =================================
    $items = new Collection();
    $items->add(‘aaaa’);
    $items->add(‘bbb’);
    $items->add(123);
    $items->add(true);

    dd($items);

    の結果が

    =================================
    Collection {#209 ▼
    #items: array:3 [▼
    0 => “aaaa”
    1 => array:1 [▼
    “hoge” => 123
    ]
    2 => true
    ]

    }

    になる意味が理解できませんでした。
    “bbb”がありませんし、”hoge”というのはどこから来たのでしょうか?

タイトルとURLをコピーしました