More than 1 year has passed since last update.

PHPの配列結合には、array_merge()、array_merge_recursive()、+演算子があるのですが、少しずつ結果が異なります。
具体的には、keyが数字の場合、array_merge()とarray_merge_recursive()は、keyを振りなおして結合。
+演算子は、keyそのままで、前の配列の値を残します。

$arrayFirst = [0 => 'a', 10 => 'b'];
$arraySecond = [0 => 'A', 100 => 'B'];
var_dump(array_merge($arrayFirst, $arraySecond));
var_dump(array_merge_recursive($arrayFirst, $arraySecond));
var_dump($arrayFirst + $arraySecond);

/* 結果
array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "A"
  [3]=>
  string(1) "B"
}
array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "A"
  [3]=>
  string(1) "B"
}
array(3) {
  [0]=>
  string(1) "a"
  [10]=>
  string(1) "b"
  [100]=>
  string(1) "B"
}
*/

ところが、keyが文字列だった場合、array_merge()は後ろの配列の値を残し、array_merge_recursive()の場合は、新たに配列を作り、両方残すように処理が変わります(+演算子は変化なし)。

$arrayThird = ['zero' => 'a', 'ten' => 'b'];
$arrayFourth = ['zero' => 'A', 'hundred' => 'B'];
var_dump(array_merge($arrayThird, $arrayFourth));
var_dump(array_merge_recursive($arrayThird, $arrayFourth));
var_dump($arrayThird + $arrayFourth);

/* 結果
array(3) {
  ["zero"]=>
  string(1) "A"
  ["ten"]=>
  string(1) "b"
  ["hundred"]=>
  string(1) "B"
}
array(3) {
  ["zero"]=>
  array(2) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "A"
  }
  ["ten"]=>
  string(1) "b"
  ["hundred"]=>
  string(1) "B"
}
array(3) {
  ["zero"]=>
  string(1) "a"
  ["ten"]=>
  string(1) "b"
  ["hundred"]=>
  string(1) "B"
}
*/

これは正しく使わないと、バグの元になりそうですね・・・。