PHP 配列のスプレッド構文

PHP 7.4 で導入されたスプレッド構文(...)は、配列を展開して別の配列や関数引数に渡す機能です。JavaScript の同名機能と同じ発想で使えます。

$a = [1, 2, 3];
$b = [4, 5, 6];

$merged = [...$a, ...$b];
// [1, 2, 3, 4, 5, 6]

array_merge() と同じ結果になりますが、より直感的に書けるのが利点です。途中に要素を挟むこともできます。

$a = [1, 2, 3];
$b = [7, 8, 9];

$result = [...$a, 4, 5, 6, ...$b];
// [1, 2, 3, 4, 5, 6, 7, 8, 9]

関数引数への展開

配列の要素を関数の引数として渡す場合にも使えます。call_user_func_array() を使っていた処理が簡潔になります。

function add(int $a, int $b, int $c): int {
    return $a + $b + $c;
}

$args = [1, 2, 3];

// 従来の方法
$result = call_user_func_array('add', $args);

// スプレッド構文
$result = add(...$args);
// 6

連想配列の制限

PHP 8.1 より前では、スプレッド構文は数値キーの配列でしか使えませんでした。連想配列を展開しようとするとエラーになります。

// PHP 8.0 以前ではエラー
$a = ['x' => 1, 'y' => 2];
$b = ['z' => 3];

// $merged = [...$a, ...$b]; // Fatal error

PHP 8.1 以降は連想配列のスプレッドも可能になりました。キーの重複時は後から来た値で上書きされます。

// PHP 8.1 以降
$defaults = ['color' => 'red', 'size' => 'M'];
$options = ['color' => 'blue'];

$merged = [...$defaults, ...$options];
// ['color' => 'blue', 'size' => 'M']

可変長引数との組み合わせ

関数定義側で ... を使うと可変長引数になります。呼び出し側のスプレッドと組み合わせると柔軟な処理が書けます。

function sum(int ...$numbers): int {
    return array_sum($numbers);
}

$values = [1, 2, 3, 4, 5];
echo sum(...$values); // 15
echo sum(10, 20, 30); // 60