【サンプル付】Laravel Collectionについてざっくりまとめ&頻出15選

LaravelのCollectionを利用すると配列の処理をスマートに記述することができます。本記事はで、利用頻度の高い関数についてまとめました。

また、これらの関数は、関数型プログラミングでは同様の処理のため、一度使えるようになれば他の言語でも流用できると思います。

Collectionを利用する上で知っておくべきこと

Collectionを利用する上で以下の点を知っておくと良いと思います。

  • EloquentとCollectionは異なる。
  • Eloquentで取得したデータは、Collectionクラスになっている。
  • Eloquentでデータ取得後は、Collectionクラスのメソッドで繋げることができる
  • Collectionメソッドは、新しいCollectionインスタンスを返す。(元のデータは不変)

chunk

コレクションを任意の要素に分割します。
Rubyだと「each_slice」があるのですが、PHPでは無いので地味に使います。

$collection = collect([1, 2, 3, 4, 5, 6, 7]);

$chunks = $collection->chunk(4);

$chunks->toArray();

// [[1, 2, 3, 4], [5, 6, 7]]

contains

指定した値がコレクションに含まれているかを判定します。
3次元連想配列も利用できます。

$collection = collect(['name' => 'Taro']);
$collection->contains('Taro');
// true


$collection = collect([
  ['name' => 'Taro'],
  ['name' => 'Hanako'],
]);
$collection->contains('name', 'Taro');
// true

count

コレクションのアイテム数を返します。

$collection = collect([1, 2, 3, 4, 5, 6, 7]);
$collection->count();
// 7

each

コレクションの繰り返し処理です。

$collection = collect([1, 2, 3, 4, 5, 6, 7]);
$collection = $collection->each(function ($item, $index) {
  // $item → 1, 2, 3 ... 7
  // $index → 0, 1, 2 ... 6
});

map

コレクションを繰り返して、新しいコレクションを返します。

$collection = collect([1, 2, 3]);
$newCollection = $collection->map(function ($item) {
  return $item * 2;
});
// [2, 4, 6]

filter

コレクションをフィルタリングします。trueを返したアイテムが残ります。

$collection = collect([1, 2, 3, 4]);

$filteredCollection = $collection->filter(function ($value) {
    return $value % 2 === 0;
});
// [2, 4]

reduce

コレクションの繰り返しの結果を次の繰り返しに渡しながら、コレクションを単一値にします。

$collection = collect([1, 2, 3]);

$total = $collection->reduce(function ($sum, $value) {
    return $sum + $value;
});
// 6

first, last

先頭/最後の要素を取得します。
callbackを指定すると、trueを返す先頭/最後の要素を取得します。

$collection = collect([1, 2, 3]);
$collection->first(); // 1
$collection->last(); // 3

$collection->first(function($value) {
  return $value >= 2;
});
// 2

$collection->last(function($value) {
  return $value >= 2;
});
// 3

groupBy

コレクションのアイテムをグループにまとめます。callbackで条件を設定することも可能です。

$humans = collect([
    ['name' => 'Taro', 'sex' => 'men'],
    ['name' => 'Hanako', 'sex' => 'women'],
    ['name' => 'Hide', 'sex' => 'men'],
]);

$groupedHumans = $humans->groupBy('sex');
$groupedHumans = $humans->groupBy(function($human) {
  return $human['sex'];
});

$groupedHumans->toArray();
/*
{
  "men": [
    {
      "name": "Taro",
      "sex": "men"
    },
    {
      "name": "Hide",
      "sex": "men"
    }
  ],
  "women": [
    {
      "name": "Hanako",
      "sex": "women"
    }
  ]
}
*/

isEmpty, isNotEmpty

コレクションが空かどうかの判定をします。

$collection = collect([1, 2]);

$collection->isEmpty(); // false
$collection->isNotEmpty(); // true

max, min

指定したキーの最大/最小値を返します。

$collection = collect([['age' => 10], ['age' => 20], ['age' => 30]]);

$collection->max('age'); // 30
$collection->min('age'); //10

reverse

コレクションのアイテムの順番を逆にします。

collect([1, 2, 3])->reverse();
// [3, 2, 1]

sort, sortBy

コレクションをソートします。
groupByにより高度な並び替えが可能です。

collect([3, 1, 2])->sort();
// [1, 2, 3]

$collection = [
  ['name' => 'Taro', 'age' => 20],
  ['name' => 'Hanako', 'age' => 18],
  ['name' => 'Hide', 'age' => 22],
];
$collection->sortBy('age');
$collection->sortBy(function($item) {
  return $item['age'];
});
/*
[
  { "name": "Taro", "age": 20 },
  { "name": "Hanako", "age": 18 },
  { "name": "Hide", "age": 22 }
]
*/

unique

コレクションの重複を取り除きます。多次元配列にも利用できます。

collect([1, 1, 2, 2, 3])->unique();
// [1, 2, 3]

$collection = collect([
  ['name' => 'Taro', 'sex' => 'men'],
  ['name' => 'Hanako', 'sex' => 'women'],
  ['name' => 'Hide', 'sex' => 'men'],
]);
$collection->unique('sex');
/*
[
  { "name": "Taro", "sex": "men" },
  { "name": "Hanako", "sex": "women" }
]
*/

where, whereIn

指定する条件で、コレクションのフィルタリングをします。

$collection = collect([
  ['name' => 'Taro', 'sex' => 'men'],
  ['name' => 'Hanako', 'sex' => 'women'],
  ['name' => 'Hide', 'sex' => 'men'],
]);

$collection->where('sex', 'men');
$collection->whereIn('sex', ['men']);
/*
[
    { "name": "Taro", "sex": "men" },
    { "name": "Hide", "sex": "men" }
]
*/

終わりに

ここでは、使う頻度が高い関数のみを紹介しました。
使う頻度は多くないものの他にも多くのメソッドが提供されています。
関数型プログラミングのメソッドは、どの言語でも似たような関数名や挙動なので一度覚えれば他の言語でも使いやすいと思います。

参考

この記事と関連している記事