Help us understand the problem. What is going on with this article?

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マニュアル

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした