[$a, $b] = $array; разбирает элементы массива на отдельные переменные в одну строку: $a получает $array[0], $b получает $array[1]. list($a, $b) = $array; это старое написание того же самого, а ['name' => $name] = $user; делает это по ключу.
Классическое применение это деструктуризация вместе с explode(): разбить строку, назвать части и идти дальше.
Пропуск элементов
Оставьте позицию пустой, чтобы её пропустить. Можно и остановиться раньше: неиспользованные элементы в конце игнорируются.
Деструктуризация ассоциативного массива по ключу
С ключами порядок в массиве не важен, и вы берёте только нужные поля. Ключ пишется перед =>, переменная после.
Для списков шаблоны вкладываются так же: [[$x1, $y1], [$x2, $y2]] = $line; читает две точки сразу. Начиная с PHP 7.3 переменная в шаблоне может быть и ссылкой, [, &$second] = $counts;, так что изменение $second меняет массив.
Одно присваивание использует либо позиции, либо ключи, но никогда не оба сразу. [$a, 'k' => $b] = $arr; останавливается с ошибкой Cannot mix keyed and unkeyed array entries in assignments.
Обмен значений двух переменных
Соберите массив из двух значений в обратном порядке и деструктурируйте его обратно. Временная переменная не нужна.
Несколько возвращаемых значений из функции
Функция PHP возвращает одно значение, но это значение может быть массивом. Деструктуризация в месте вызова делает его похожим на несколько возвращаемых значений. Если значений больше двух или трёх, возвращайте ключи, чтобы вызывающий код не перепутал порядок.
Деструктуризация в foreach
Тот же синтаксис работает в строке foreach, поэтому каждая строка приходит уже разобранной на именованные переменные. Именно это имеют в виду под "foreach с list()". Другие шаблоны циклов на странице про foreach.
Оператор распаковки (...)
Три точки разворачивают массив на месте. В литерале массива [...$a, ...$b] объединяет массивы. В вызове функции f(...$args) передаёт элементы отдельными аргументами. В определении функции ...$args собирает лишние аргументы в массив.
До PHP 8.1 распаковка массива со строковыми ключами была ошибкой; теперь строковые ключи сохраняются, а числовые перенумеровываются, по тем же правилам, что у array_merge(). Вариативные параметры вроде ...$amounts описаны вместе с другими видами параметров на странице о функциях.
Частая ошибка: элементов меньше, чем переменных
Если массив короче шаблона, недостающие переменные становятся null, а PHP печатает предупреждение для каждой. Так бывает с данными, которые вы не контролируете, например со строкой, где не хватает полей. Для [$name, $city, $country] = explode(',', 'Grace'); PHP печатает:
Warning: Undefined array key 1 in /var/www/html/import.php on line 5
Warning: Undefined array key 2 in /var/www/html/import.php on line 5
Решите, каким должен быть недостающий кусок, и дополните массив перед деструктуризацией:
Для шаблонов с ключами сначала подмешайте значения по умолчанию: ['a' => $a, 'b' => $b] = $input + ['a' => null, 'b' => null];. Оператор + добавляет только те ключи, которых в $input ещё нет.
Часто задаваемые вопросы
Что делает list() в PHP?
list($a, $b) = $array; присваивает $array[0] переменной $a, а $array[1] переменной $b. Начиная с PHP 7.1 короткая форма [$a, $b] = $array; делает ровно то же, и обе формы принимают ключи: ['id' => $id] = $row;.
Как поменять местами значения двух переменных в PHP?
Деструктурируйте новый массив из них в обратном порядке: [$a, $b] = [$b, $a];. Временная переменная не нужна.
Можно ли использовать list() с ассоциативным массивом в PHP?
Да, начиная с PHP 7.1. Укажите ключи: ['name' => $name, 'email' => $email] = $user; или list('name' => $name) = $user;. Без ключей [$a, $b] = $user; ищет ключи 0 и 1 и получает null с предупреждением.
Что означают три точки (...) в PHP?
Это оператор распаковки. В литерале массива [...$a, ...$b] копирует элементы обоих массивов в новый. В вызове max(...$numbers) передаёт элементы отдельными аргументами. В определении функции function sum(...$numbers) собирает любое число аргументов в массив.
Что будет, если в массиве меньше элементов, чем переменных в list()?
Лишние переменные получат null, а PHP напечатает предупреждение вроде Undefined array key 2. Сначала дополните массив, например [$a, $b, $c] = array_pad($parts, 3, null);.