PHP 配列の結合:array_merge と + 演算子の違い
PHP で配列を結合する方法は主に array_merge() と + 演算子の 2 つがあります。一見同じように見えますが、挙動が大きく異なるため使い分けが重要です。
array_merge()
数値キーは再インデックスされ、文字列キーは後から来た値で上書きされる。
+ 演算子
キーが重複した場合、左側(先に来た方)の値が優先される。数値キーも再インデックスされない。
通常の配列での違い
数値インデックスの配列では、結果が大きく異なります。
$a = [1, 2, 3];
$b = [4, 5, 6];
// array_merge: 連結される
$merged = array_merge($a, $b);
// [1, 2, 3, 4, 5, 6]
// + 演算子: キー 0, 1, 2 は $a が優先
$plus = $a + $b;
// [1, 2, 3]($b の要素は追加されない)通常の配列を連結したい場合は array_merge() を使います。+ 演算子では期待した結果になりません。
連想配列での違い
連想配列では、キーが重複したときの優先順位が逆になります。
$defaults = ['color' => 'red', 'size' => 'M'];
$options = ['color' => 'blue'];
// array_merge: 後が優先
$merged = array_merge($defaults, $options);
// ['color' => 'blue', 'size' => 'M']
// + 演算子: 先が優先
$plus = $options + $defaults;
// ['color' => 'blue', 'size' => 'M']
// + 演算子: 順序を逆にすると結果も変わる
$plus2 = $defaults + $options;
// ['color' => 'red', 'size' => 'M']デフォルト値の設定
オプション引数にデフォルト値を設定する場面では、+ 演算子が便利です。ユーザー指定の値を優先しつつ、指定がない項目はデフォルト値で埋める、という処理が 1 行で書けます。
function createUser(array $options): array {
$defaults = [
'role' => 'user',
'active' => true,
'locale' => 'ja'
];
return $options + $defaults;
}
$user = createUser(['name' => 'Alice', 'role' => 'admin']);
// ['name' => 'Alice', 'role' => 'admin', 'active' => true, 'locale' => 'ja']スプレッド構文(PHP 7.4+)
PHP 7.4 以降は ... を使った配列展開も可能です。array_merge() と同じ挙動になります。
$a = [1, 2, 3];
$b = [4, 5, 6];
$merged = [...$a, ...$b];
// [1, 2, 3, 4, 5, 6]