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 errorPHP 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