Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Як працює деструктуризація масивів і spread-оператор у PHP?

Деструктуризація - розпакування масиву в окремі змінні (короткий синтаксис замість 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.

Докладніше в документації: Деструктуризація масивів

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання