PHP

array_merge()の罠にはまった話

PHP勉強してて、配列関数とか見始めたくらいの方に向けて書いてます。


array_merge()に出会った

ある日こんなソースコードに出会いました。(※説明用に改編してます。)

$judgment = false;

$array1 = ["color" => "red", 2, 4];
$array2 = ["a", "b", "color" => "green", "shape" => "trapezoid", 4];
if ($judgment === true) {
$array3 = ["shape" => "triangle", 1, 3];
}
$result = array_merge($array1, $array2, $array3);
print_r($result);

array_merge() ってなんだっけ?

と思いまして、とりあえずPHPマニュアルをググりました。


array_merge — ひとつまたは複数の配列をマージする

前の配列の後ろに配列を追加することにより、 ひとつまたは複数の配列の要素をマージし、得られた配列を返します。


ふむ。

配列をくっつけるんだね。


入力配列が同じキー文字列を有していた場合、そのキーに関する後に指定された値が、 前の値を上書きします。しかし、配列が同じ添字番号を有していても 値は追記されるため、このようなことは起きません。


ふむふむ。

同じキーは上書きされると。


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


ふむふむふむ。

キーの数値が振りなおされるんだね。分かった。

なるほどね。たぶん出力したらこんな感じでしょ?簡単じゃん。

Array

(
[color] => green
[0] => 2
[1] => 4
[2] => a
[3] => b
[shape] => trapezoid
[4] => 4
)


出力結果

NULL
































ん????????????????????????????????????

様子がおかしい。


もうちょい詳しく見てみた

if 文ではじかれて $array3 取得できてないし、第3引数が原因っぽいなあと思ったので、少し調べてみます。


第3引数が空じゃない時

まずは一応全部ちゃんと入ってる場合で試します。

$array1 = array("color" => "red", 2, 4);

$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$array3 = array("shape" => "triangle", 1, 3);
$result = array_merge($array1, $array2, $array3);
print_r($result);

/* 結果
Array ( [color] => green [0] => 2 [1] => 4 [2] => a [3] => b [shape] => triangle [4] => 4 [5] => 1 [6] => 3 )
*/

よし入ってる。

と言うわけでここから本題。

次はNULL・空文字・空配列を入れて試してみます。


NULLを入れる

$array1 = array("color" => "red", 2, 4);

$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2, NULL);
print_r($result);

/* 結果
NULL
*/

うわ。NULLになった。

どうやら、NULLで上書きされるみたいですね。


空文字を入れる

$array1 = array("color" => "red", 2, 4);

$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2, '');
print_r($result);

/* 結果
NULL
*/

うわ。またNULLになった。

どっか空だと全部NULLになるのでしょうか?


空配列を入れる

$array1 = array("color" => "red", 2, 4);

$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2, array());
print_r($result);

/* 結果
Array ( [color] => green [0] => 2 [1] => 4 [2] => a [3] => b [shape] => trapezoid [4] => 4 )
*/

キタ━━━━ヽ(☆∀☆ )ノ━━━━!!!!

どうやら型の問題だったみたいですね。


さいごに

array_merge()の引数は、配列のみにしておこう


参考

array_merge - PHPマニュアル