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]