今回は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", ]メルマガ購読の申し込みはこちらから。