🕵🏾

【Laravel9】Collectionクラスの中身を見る~mapメソッド編~

2023/02/02に公開

はじめに

配列を操作するためのラッパークラスであるIlluminate\Support\CollectionクラスにはLaravel9では139個ものメソッドがあります。
Laravelを使用していたら見かけるであろう、map()やpluck()、merge()はCollectionクラスのメソッドです。

公式ドキュメントも貼っておきます。

https://readouble.com/laravel/9.x/ja/collections.html

今回は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でkeysをキーに、itemsを値とした配列を返しています。

array_combineのリファレンスはこちら

まとめ

Collectionクラスのmapメソッドは、内部的にIlluminate\Support\Arrクラスのmapメソッドを実行していて、
PHP組み込み関数のarray_mapメソッドとarray_combineメソッドを実行して新しいCollectionを返していることが分かりました。

Discussion