Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
19
Help us understand the problem. What is going on with this article?
@sunnyG

array_merge()の罠にはまった話

More than 1 year has passed since last update.

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

19
Help us understand the problem. What is going on with this article?
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
kaonavi
業界シェアNo.1のタレントマネジメントシステム『カオナビ』の開発・提供をするHRテクノロジーカンパニー

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
19
Help us understand the problem. What is going on with this article?