開発をしているとArray型のデータを扱うことが多くあります。
PHPにはArrayに関する様々な関数が実装されていますが、
イテレートや値の変更という点でコードが読みにくくなりがち
という欠点もあります。
Arrayは array_xx()
の引数となることで変化する場合が多い
もし、下のコードでreturn の結果が実装者の予想と異なり原因を調査したいとして
$numbers = [1, 2];
・ // 間に何十行も処理がはさまっているとする
$numbers = [1, 2, 3];
・
return $numbers;
↑こうしたケースでは、$numbersがどう変化したかは追いやすいですが、次のようなケースではどうでしょう?
$numbers = [1, 2];
・
array_push($numbers, 3);
・
return $numbers;
↑$numbersの動きが少し分かりにくくなったかと思います
$numbers = [1, 2];
$newNumbers = [];
foreach($numbers as $i => $element) {
$numbers[$i] = $numbers[$i] + 1;
$element = $element + 1
$newNumbers[$i] = $element;
// $i=0のこの行時点での$numbers[$i]と$elementの値はどうなっているんだっけ? foreachが終わったときの状態は???
}
return $numbers;
↑return 時点の$numbersを推測するのに、さらに集中力を要するようになりました。
この例ではチェックする先が10行にも満たないので、
「読めばわかるじゃん」で済むかと思います。
しかし実際にはこうした調査はバグの発生など、
心に余裕のない状況で行われるため、
直感的に理解しやすいコードであるに越したことはありません。
Collectionクラスはこれらの問題を解決してくれます。
Collectionの変化は自身のメソッドで行う
$nunbers = collect([1, 2]);
$nunbers->push(3);
$namesWithNumbers = $nunbers->map(function ($element) {
return $element + 1;
});
return $numbers;
- 要素の追加がメソッドで行えるため、$collectionを対象にした操作であることが分かりやすくなる
- map, each, filter などJavascriptでもお馴染みのイテレータが使える
- 繰り返しの内容がclosureに収まっているので、$numbersや他の変数の値が変化しないことが担保されている
他にも
-
collect(['a' => 'A'])->get('b', 'not found')
でキーが存在しない場合に'not found'
を返してくれる(連想配列では undefined key のエラーとなる) -
collect(['a' => 'A', 'b' => 'B'])->keys()
でキーの[a, b]
だけを取得する -
collect([1, 2, 3])->diff(collect([1, 2]))
で差分の3
を取得する -
firstWhere('age', '>=', 18)
でコレクションの中から条件に一致する要素を一つだけ取得する
などなど、紹介しきれないほど多様で便利なメソッドが公式ドキュメント1ページにまとまっています。
Collectionは実用性が非常に高く学習コストも比較的低いので、
Laravelの学習をどこから始めたらいいか迷っている人はぜひここから手をつけてみるのがオススメです。