search
LoginSignup
63
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

PHPの配列結合

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"
}
*/

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
63
Help us understand the problem. What are the problem?