2013年1月29日火曜日

似てるけど似てないPHPの配列を結合する

AdventCalendar2012でも書きましたが似てるけど似てないシリーズ。
(シリーズといいながら思いついたときに書き残そうと思っただけですが)
(というかほぼ自分の備忘録)

今回は配列の結合。
最近知ったことなんですが配列を結合に+という配列結合演算子があります。
今まで配列の結合と言えば array_merge と思っていたんですが + もありました。

何か違うことでもあるのかなと思って実際に試してみました。

簡単な例ですが
$tmp1_1 = array("1", "2", "3");
$tmp1_2 = array("a", "b", "c", "d");

var_dump(array_merge($tmp1_1, $tmp1_2));
// 結果
//array
//  0 => string '1' (length=1)
//  1 => string '2' (length=1)
//  2 => string '3' (length=1)
//  3 => string 'a' (length=1)
//  4 => string 'b' (length=1)
//  5 => string 'c' (length=1)
//  6 => string 'd' (length=1)

var_dump($tmp1_1 + $tmp1_2);
// 結果
//array
//  0 => string '1' (length=1)
//  1 => string '2' (length=1)
//  2 => string '3' (length=1)
//  3 => string 'd' (length=1)

全然、違います。
array_merge は指定した配列同士を連結していますが、+ の場合は前に指定した配列に値が追加されるような動きになります。

PHP: array_merge - Manual
http://jp1.php.net/manual/ja/function.array-merge.php
PHP: 配列演算子 - Manual
http://php.net/manual/ja/language.operators.array.php

php.netによると同じキー文字列を有している場合は、後に指定された配列により上書きされる。
とあるので
$tmp2_1 = array(
        "key_1" => "1",
        "key_2" => "2",
        "key_3" => "3",
    );
$tmp2_2 = array(
        "key_1" => "a",
        "key_2" => "b",
        "key_3" => "c",
        "key_4" => "d",
    );

var_dump(array_merge($tmp2_1, $tmp2_2));
// 結果
//array
//  'key_1' => string 'a' (length=1)
//  'key_2' => string 'b' (length=1)
//  'key_3' => string 'c' (length=1)
//  'key_4' => string 'd' (length=1)

var_dump($tmp2_1 + $tmp2_2);
// 結果
//array
//  0 => string '1' (length=1)
//  1 => string '2' (length=1)
//  2 => string '3' (length=1)
//  3 => string 'd' (length=1)

array_merge のほうは同じキー文字列を有しているので上書きされているのがわかります。
+ のほうは先ほどの結果と同じです。

動きを理解しておかないと思わぬ結果が返ってくるかもしれないです。




0 件のコメント:

コメントを投稿