【Laravel9】Collectionクラスの中身を見る~mapメソッド編~
はじめに
配列を操作するためのラッパークラスであるIlluminate\Support\CollectionクラスにはLaravel9では139個ものメソッドがあります。
Laravelを使用していたら見かけるであろう、map()やpluck()、merge()はCollectionクラスのメソッドです。
公式ドキュメントも貼っておきます。
今回はmapメソッドが何をしているのか見ていきます。
環境
- Windows11(WSL2)
- PHP 8.2.1
- Laravel 9.50.1
- sail 2.6.1
mapメソッドとは
Collectionクラスのmapメソッドは引数のコールバック処理を対象のコレクションに実行して、新しいコレクションを返すメソッドです。
動作確認
簡単なプログラムでmapメソッドの動きを確認します。
例:名字が格納されているコレクション全体に「さん」を付ける
$users = collect(['井上','加藤','山下']);
$result = $users->map(function ($user){
return "${user}さん";
});
dd($result);
Illuminate\Support\Collection {#264 ▼
#items: array:3 [▼
0 => "井上さん"
1 => "加藤さん"
2 => "山下さん"
]
#escapeWhenCastingToString: false
}
mapメソッドの中身
Illuminate\Support\Collection::map
Collectionクラスのmapメソッドは以下のようになっています。
public function map(callable $callback)
{
return new static(Arr::map($this->items, $callback));
}
new staticなのでmapメソッドが呼び出されたときに、引数のArr::mapをインスタンス化しています。
さらにIlluminate\Support\Arrクラスのmapメソッドを追ってみます。
ちなみにArr::mapメソッドはLaravel9で新しく追加されたもののようです。
Illuminate\Support\Arr::map
ここでmapの具体的な中身が見えてきます。
public static function map(array $array, callable $callback)
{
$keys = array_keys($array);//①
try {
$items = array_map($callback, $array, $keys);//②
} catch (ArgumentCountError) {//③
$items = array_map($callback, $array);
}
return array_combine($keys, $items);//④
}
①array_keysで全てのキーを$keysに格納しています。
②array_mapで$itemsに新しい配列を返しています。
array_mapのリファレンスはこちら
③例外はArguentCountErrorをキャッチしています。
ArgumentCountErrorは引数が足りないときに発生する例外です。
④そしてreturn array_combineで
array_combineのリファレンスはこちら
まとめ
Collectionクラスのmapメソッドは、内部的にIlluminate\Support\Arrクラスのmapメソッドを実行していて、
PHP組み込み関数のarray_mapメソッドとarray_combineメソッドを実行して新しいCollectionを返していることが分かりました。
Discussion