今回はLaravelを離れてPHPのベーシックの話となります。連想配列(associative array)のマージに関してです。なかな知っているようで使用を間違うことがあります。

そういうきは、私が大好きなツール、tinkerを使ってちょいちょいと実行して確認してみるのが一番。

array_merge

まずは、array_mergeを使用して2つの配列、$productと$moreをマージ。

>>> $product = ['product_id' => 1, 'name' => '商品名']
=> [
     "product_id" => 1,
     "name" => "商品名",
   ]
>>> $more = ['price' => 200]
=> [
     "price" => 200,
   ]
>>> array_merge($product, $more)
=> [
     "product_id" => 1,
     "name" => "商品名",
     "price" => 200,
   ]

両方の配列の項目が1つに収まります。

さて、両方の配列に同じ項目があるときはどうでしょう?

>>> $product = ['product_id' => 1, 'name' => '商品名']
=> [
     "product_id" => 1,
     "name" => "商品名",
   ]
>>> $more = ['price' => 200, 'name' => '上書き商品名']
=> [
     "price" => 200,
     "name" => "上書き商品名",
   ]
>>> array_merge($product, $more)
=> [
     "product_id" => 1,
     "name" => "上書き商品名",
     "price" => 200,
   ]

後者の配列に前者と同じ項目があるなら、後者の配列の値が前者を上書きとなります。

+

連想配列をマージできるのは、array_mergeだけではありません。足し算の+のオペレータも同様なことができます。

>>> $product = ['product_id' => 1, 'name' => '商品名']
=> [
     "product_id" => 1,
     "name" => "商品名",
   ]
>>> $more = ['price' => 200, 'name' => '上書き商品名']
=> [
     "price" => 200,
     "name" => "上書き商品名",
   ]
>>> $product + $more
=> [
     "product_id" => 1,
     "name" => "商品名",
     "price" => 200,
   ]

しかし今度は、後者の配列に前者と同じ項目があるなら、上書きは起こりません。

キーが数字のとき

上の例は、連想配列のキーが文字列でしたが、数字のときにはどうなるでしょう? 例えば、キーにDBのレコードのID(数字)を入れて配列を作成するケースは良くあります。

>>> $products = [11 => '商品A', 12 =>'商品B']
=> [
     11 => "商品A",
     12 => "商品B",
   ]
>>> $more_products = [13 => '商品C', 14 => '商品D']
=> [
     13 => "商品C",
     14 => "商品D",
   ]
>>> array_merge($products, $more_products)
=> [
     [
       "商品A",
     ],
     [
       "商品B",
     ],
     [
       "商品C",
     ],
     [
       "商品D",
     ],
   ]
>>> $products + $more_products
=> [
     11 => [
       "商品A",
     ],
     12 => [
       "商品B",
     ],
     13 => [
       "商品C",
     ],
     14 => [
       "商品D",
     ],
   ]

サプライズ!上の例のように両方の配列のキーがどれも数字なら、array_mergeでは、割り当てたキーが皆消えてしまいます。実際には消えるのではなく、キーが0,1,2,3と順番に与えられて通常の配列になります。しかし、+で足し算をするなら、キーは結果においてキープされます。しかし、両者の配列に同じキーがあるなら、さきほどのように後者は前者を上書きはしません。

>>> $products = [11 => '商品A', 12 =>'商品B']
=> [
     11 => "商品A",
     12 => "商品B",
   ]
>>> $more_products = [12 => '商品C', 13 => '商品D']
=> [
     12 => "商品C",
     13 => "商品D",
   ]
>>> $products + $more_products
=> [
     11 => "商品A",
     12 => "商品B",
     13 => "商品D",
   ]

By khino