PHPの配列連結演算子が気が利かないという話

こういうPHPコードを考える。

print_r([0, 1] + [2, 3, 4]);

しかしこのコードは期待したとおりの挙動をとらない。出力はこうなる:

Array
(
    [0] => 0
    [1] => 1
    [2] => 4
)

この挙動はPHPの配列連結演算子の仕様に拠っている。

+ 演算子は、右側の配列を左側の配列に追加したものを返します。 両方の配列に存在するキーについては左側の配列の要素が優先され、 右側の配列にあった同じキーの要素は無視されます。

そして、PHPの配列は本質的に連想配列であり、通常の配列のように見えるものはint型をキーとする連想配列にすぎない。

PHP においては添字配列と連想配列の間に違いはなく、配列型は 1 つだけで、 同じ配列で整数のインデックスと文字列のインデックスを同時に使えます。

したがって、要素0と要素1は上書きされることなく残り、要素2である値4だけが追加される。

ちなみに、array_merge()関数を用いて

print_r(array_merge([0, 1], [2, 3, 4]));

とすれば期待した結果が得られる。これもarray_merge()関数の仕様に拠る。

入力配列の中にある数値添字要素の添字の数値は、 結果の配列ではゼロから始まる連続した数値に置き換えられます。

ということで、気をつけましょうという話でした。