ど素人から毛を生やす。<延>

[PHP]連想配列を合成するには array_merge() か $array + $array か

Web > PHP 2023年7月21日(最終更新:10月前)

2023年7月21日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

どもです。
2つの連想配列を合体させる場合、一般的に考える手段は array_merge($array1, $array2) だと思います。

しかしこのarray_merge()、「数値添字要素の添字の数値は、 結果の配列ではゼロから始まる連続した数値に置き換える」という性質を持っています。

この性質により、連想配列のキーが数字の場合、キーが変更されてしまうのです。

$array1 = array(
	'A1'	=> 'A',
	 2		=> 'B',
);
$array2 = array(
	'2'	=> 'C',
);
print_r(array_merge($array1, $array2));

⇒
Array
(
    [A1] => A
    [0] => B
    [2] => C
)

PHPは自動的に型変換することがあるため、文字列型のつもりでいたキーが数値型になっていて、array_merge() でキーが変わってしまった…なんてことが起こります。起こりました。(実話)

では、どう対応すればといえば、array_merge() ではなく $array + $array にすることです。

$array1 = array(
	'A1'	=> 'A',
	 2		=> 'B',
);
$array2 = array(
	'2'	=> 'C',
);
print_r($array1 + $array2);

⇒
Array
(
    [A1] => A
    [2] => B
)

$array + $array の場合、キーを再配布されることがないので、想定した通りの動きになると思います。
どういった動作をさせたいのかにもよりますが、基本的には連想配列の合成は array_merge() より $array + $array の方が安牌です。

$array1 = array('A'=> 1 );
$array2 = array('A'=> 2 );

print_r(array_merge($array1, $array2));	//Array ( [A] => 2 ) 
print_r($array1 +  $array2);			//Array ( [A] => 1 )

なお、合成する配列に同じキーが存在していた場合、array_merge() は後の配列が、$array + $array は前の配列が優先されます。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)