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 = ["color" => "red", 2, 4];
$array2 = ["a", "b", "color" => "green", "shape" => "trapezoid", 4];
$array3 = ["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 = ["color" => "red", 2, 4];
$array2 = ["a", "b", "color" => "green", "shape" => "trapezoid", 4];
$result = array_merge($array1, $array2, NULL);
print_r($result);
/* 結果
NULL
*/
うわ。NULL
になった。
どうやら、NULL
で上書きされるみたいですね。
##空文字を入れる
$array1 = ["color" => "red", 2, 4];
$array2 = ["a", "b", "color" => "green", "shape" => "trapezoid", 4];
$result = array_merge($array1, $array2, '');
print_r($result);
/* 結果
NULL
*/
うわ。またNULL
になった。
どっか空だと全部NULL
になるのでしょうか?
#空配列を入れる
$array1 = ["color" => "red", 2, 4];
$array2 = ["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()の引数は、配列のみにしておこう