PHP 配列の + 演算子が便利な件

配列(array)変数を連結する関数として、 array_merge と array_merge_recursive の2つが有名ですが、
+ 演算子も使える事が意外と知られていないような気がするので自分へのメモを兼ねつつ紹介。

実験コード

$a = array('goo1' => 'goo1', 'goo2' => array('goo2-1', 'goo2-2'));
$b = array('goo1' => 'foo1', 'goo2' => array('foo2-1', 'foo2-2'));

echo "# array_merge\n";
var_dump(array_merge($a, $b));

echo "# array_merge_recursive\n";
var_dump(array_merge_recursive($a, $b));

echo "# array +\n";
var_dump($a + $b);

先にまとめ

いずれも、(_recursive でなくても)配列を再帰的に処理しますが、動きは三者三様です。

  • array_merge_recursive は要素の key がぶつかる場合は、(一段深くなるが)配列として value を列挙する。
  • array_merge と + は key がぶつかると、value は片方残る。array_merge は後勝ち。+ は早いもの勝ち。

参考

実験結果

% php  array_test.php
# array_merge
array(2) {
  ["goo1"]=>
  string(4) "foo1"
  ["goo2"]=>
  array(2) {
    [0]=>
    string(6) "foo2-1"
    [1]=>
    string(6) "foo2-2"
  }
}
# array_merge_recursive
array(2) {
  ["goo1"]=>
  array(2) {
    [0]=>
    string(4) "goo1"
    [1]=>
    string(4) "foo1"
  }
  ["goo2"]=>
  array(4) {
    [0]=>
    string(6) "goo2-1"
    [1]=>
    string(6) "goo2-2"
    [2]=>
    string(6) "foo2-1"
    [3]=>
    string(6) "foo2-2"
  }
}
# array +
array(2) {
  ["goo1"]=>
  string(4) "goo1"
  ["goo2"]=>
  array(2) {
    [0]=>
    string(6) "goo2-1"
    [1]=>
    string(6) "goo2-2"
  }
}

感想

早いもの勝ちで動く + は結構便利。 $a の値を優先的に使う場合、

$z = $a + $b;

のように表現出来ますし。

ただ、変数が配列だと気付かない人もいそうなので、ソレとわかるような工夫が必要ですね。