PHPにおける配列の結合(array_mergeと+演算子)の違い


いまさらながら調べてみた。

まずはPHPのマニュアル

array_merge

前の配列の後ろに配列を追加することにより、 ひとつまたは複数の配列の要素をマージし、得られた配列を返します。
入力配列が同じキー文字列を有していた場合、そのキーに関する後に指定された値が、 前の値を上書きします。しかし、配列が同じ添字番号を有していても 値は追記されるため、このようなことは起きません。
入力配列の中にある数値添字要素の添字の数値は、 結果の配列ではゼロから始まる連続した数値に置き換えられます。

キーは上書きで、添字番号は追加でいいのか?試してみた。

<?php
    $x = array('a', 'b');
    $y = array('c', 'd', 'e');

    var_dump(array_merge($x, $y));
?>

を実行すると、

array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
}

確かに後に追加されている。
同様に+演算子。

<?php
    $x = array('a', 'b');
    $y = array('c', 'd', 'e');

    var_dump($x + $y);
?>


array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "e"
}

こちらは同じ添字番号だと上書きせず、なかったら追加している。
次に連想配列の結合。

<?php
$x = array(
    'K1' => 'a',
    'K2' => 'b'
);

$y = array(
    'K1' => 'c',
    'K2' => 'd',
    'K3' => 'e'
);

var_dump(array_merge($x, $y));    
var_dump($x + $y);
?>

array_merge

array(3) {
  ["K1"]=>
  string(1) "c"
  ["K2"]=>
  string(1) "d"
  ["K3"]=>
  string(1) "e"
}

同じキーは上書きして、なかったら追加。

+演算子

array(3) {
  ["K1"]=>
  string(1) "a"
  ["K2"]=>
  string(1) "b"
  ["K3"]=>
  string(1) "e"
}

こちらは、先ほどと同様キーがなかったら追加している。

では、混じっていたらどうなるんだろう?

<?php
$x = array(
    'K1' => 'a',
    1 => 'b'
);

$y = array(
    'K1' => 'c',
    '1' => 'd',
    2 => 'e'
);

var_dump(array_merge($x, $y));
var_dump($x + $y);
?>

array_merge

array(4) {
  ["K1"]=>
  string(1) "c"
  [0]=>
  string(1) "b"
  [1]=>
  string(1) "d"
  [2]=>
  string(1) "e"
}

キーは上書き、添字は追加。ここで気になるのは、添字の1と’1’が区別されてること。

+演算子

array(3) {
  ["K1"]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "e"
}

こちらは一貫して添字がなかったら追加。

+演算子を使うシーンがあまりないかな。(でもどこかで使っていたような?)

うーん、array_mergeって、結合後の戻り値は0からの添字を振り直すのだから、キーの時も上書きなんてせずに追加だけしてくれれば良くないか?

$z = array_merge(array_values($x), array_values($y));

とやって置けば確実に配列が追加される。

The following two tabs change content below.

TAIRA

Sofrware Engineer.

Comments are closed.