46
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

array_merge()の罠にはまった話

Last updated at Posted at 2018-05-01

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()の引数は、配列のみにしておこう

#参考
array_merge - PHPマニュアル

46
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?