初めに
配列を結合するarray_merge
ですが、配列のキーが数値の時と文字列の時とで動作が少し異なります。
array_mergeはキーが数値の場合、ゼロから始まる連続した数値に置き換えられてしまいます。
以下公式ドキュメントの抜粋。
入力配列の中にある数値添字要素の添字の数値は、 結果の配列ではゼロから始まる連続した数値に置き換えられます
試してみる
例えば、キーが文字列の配列を結合してもキーは変わりません。
<?php
$array1 = ['key1' => 'one', 'key2' => 'two'];
$array2 = ['key4' => 'four', 'key7' => 'seven'];
var_dump(array_merge($array1, $array2));
結果
array(4) {
["key1"] => string(3) "one"
["key2"] => string(3) "two"
["key4"] => string(4) "four"
["key7"] => string(5) "seven"
}
しかし、キーが数値の配列を結合すると、キーが変わってしまいます。
<?php
$array1 = [1 => 'one', 2 => 'two'];
$array2 = [4 => 'four', 7 => 'seven'];
var_dump(array_merge($array1, $array2));
結果
array(4) {
[0] => string(3) "one"
[1] => string(3) "two"
[2] => string(4) "four"
[3] => string(5) "seven"
}
ちなみに、シングルクォーテーションで囲んでも数値扱いでキーが変わります。
<?php
$array1 = ['1' => 'one', '2' => 'two'];
$array2 = ['4' => 'four', '7' => 'seven'];
var_dump(array_merge($array1, $array2));
結果
array(4) {
[0] => string(3) "one"
[1] => string(3) "two"
[2] => string(4) "four"
[3] => string(5) "seven"
}
キーを変えたくない場合はどうするべきか
array_merge
は使わずに+
を使うことでキーを保つことができました。
<?php
$array1 = [1 => 'one', 2 => 'two'];
$array2 = [4 => 'four', 7 => 'seven'];
// var_dump(array_merge($array1, $array2));
var_dump($array1 + $array2);
結果
array(4) {
[1] => string(3) "one"
[2] => string(3) "two"
[4] => string(4) "four"
[7] => string(5) "seven"
}