Simple, Slowly

ブログを引っ越ししました。http://48.jp

array_mergeとarray+arrayの挙動の違いを検証してみました

array_mergeとarray+arrayの挙動の違いの理解が曖昧だったので検証してみました。

例1 基本的な配列の場合

<?php
$array1 = array(1, 3); 
$array2 = array(2, 4);
$result1 = array_merge($array1, $array2);
$result2 = $array1 + $array2;
print_r($result1);
print_r($result2);
?>

Array
(
    [0] => 1
    [1] => 3
    [2] => 2
    [3] => 4
)
Array
(
    [0] => 1
    [1] => 3
)
結果

array_merge
キーが同じでも完全にマージされている。
array1 + array2
両方の配列に同じキーが存在する場合は前方の配列が残り、 後方の配列は無視されている。

例2 連想配列の場合

<?php
$array1 = array('color'=>'red', 'shape'=>'circle');
$array2 = array('color'=>'green', 'shape'=>'rectangle');
$result1 = array_merge($array1, $array2);
$result2 = $array1 + $array2;
print_r($result1);
print_r($result2);
?>
Array
(
    [color] => green
    [shape] => rectangle
)
Array
(
    [color] => red
    [shape] => circle
)
結果

array_merge
両方の配列に同じキーが存在する場合は、後方の配列が優先される。
array1 + array2
両方の配列に同じキーが存在する場合は、前方の配列が優先される。

例3 ネストした配列の場合

<?php
$array1 = array('color'=>'red', 'shape'=>'circle', array('option'=>'cut', 'element'=>'chromium'));
$array2 = array('color'=>'green', 'shape'=>'rectangle', array('option'=>'paste', 'area'=>'top'));
$result1 = array_merge($array1, $array2);
$result2 = $array1 + $array2;
print_r($result1);
print_r($result2);
?>

Array
(
    [color] => green
    [shape] => rectangle
    [0] => Array
        (
            [option] => cut
            [element] => chromium
        )

    [1] => Array
        (
            [option] => paste
            [area] => top
        )

)
Array
(
    [color] => red
    [shape] => circle
    [0] => Array
        (
            [option] => cut
            [element] => chromium
        )

)
結果

array_merge
ネストした配列はキーがそれぞれふられ、全てマージされる。
array1 + array2
ネストした配列は、前方の配列が優先される。

結論

array_mergeとarray+arrayは似ているようで、挙動が異なる。
なんとなくで使用すると、バグの温床になる可能性があるので注意する。