Деструктуризація - розпакування масиву в окремі змінні (короткий синтаксис замість list()):
[$first, $second] = [10, 20];
[, $second] = [10, 20]; // пропустити елемент
['id' => $id, 'name' => $name] = $user; // за ключами
[$a, [$b, $c]] = [1, [2, 3]]; // вкладене
[$a, $b] = [$b, $a]; // обмін значеннями
foreach ($rows as ['id' => $id, 'email' => $email]) {
// ...
}
Якщо ключа немає, змінна отримає null з попередженням.
Spread-оператор ... розпаковує масив у місці виклику чи в літералі масиву:
$all = [...$defaults, ...$overrides]; // склеїти масиви
$merged = [...['a' => 1], ...['a' => 2, 'b' => 3]]; // ['a' => 2, 'b' => 3] (PHP 8.1+)
function sum(int ...$numbers): int // збір аргументів (variadic)
{
return array_sum($numbers);
}
sum(...[1, 2, 3]); // передача масиву як аргументів
Що варто знати:
- Рядкові ключі в spread дозволені з PHP 8.1 і поводяться як
array_merge: пізніший ключ перемагає. Числові ключі перенумеровуються. - Spread ітератора:
[...$generator]працює з будь-якимTraversable. - Іменовані аргументи зі spread:
create(...['name' => 'Оля', 'email' => '...'])(PHP 8.1+) - ключі масиву стають іменами параметрів. - Не для великих масивів у циклі:
$result = [...$result, $item]у циклі щоразу копіює весь масив - квадратична складність. Для накопичення -$result[] = $item.