Menu

PHP list() и деструктуризация массива: [$a, $b] = $arr

[$a, $b] = $array присваивает первые два элемента переменным $a и $b в одну строку, а ['name' => $name] = $user делает то же по ключу. list() это старое написание. Пропуск элементов, обмен значений переменных, несколько возвращаемых значений, деструктуризация в foreach и оператор распаковки ....

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

[$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);.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ