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