list()
Функция list() в PHP используется для присваивания значений списку переменных за одну операцию при работе с массивами.
Введение
list() — это языковая конструкция PHP (не функция), которая деструктурирует массив, присваивая каждый его элемент отдельной переменной в одном выражении. Вместо того чтобы извлекать значения по одному индексу за раз, вы описываете структуру массива в левой части выражения и позволяете PHP заполнить переменные самостоятельно.
На этой странице рассматриваются базовый синтаксис, современная краткая форма [], способы пропуска и вложения элементов, форма с ассоциативными ключами (PHP 7.1+), а также типичные подводные камни. list() наиболее полезен, когда функция или выражение уже возвращает массив PHP и вы хотите дать имена его частям.
Базовый синтаксис
Базовый синтаксис конструкции list() выглядит следующим образом:
Синтаксис PHP конструкции list()
list($var1, $var2, $var3) = $array;$array в правой части предоставляет значения. Конструкция присваивает их переменным в левой части по позиции — элемент 0 присваивается $var1, элемент 1 — $var2 и так далее.
Краткий синтаксис массива []
Начиная с PHP 7.1, вместо ключевого слова list() можно использовать квадратные скобки. Обе формы эквивалентны — краткая форма сейчас является более распространённым стилем:
<?php
$point = [10, 20];
[$x, $y] = $point; // same as list($x, $y) = $point;
echo "$x, $y"; // Output: 10, 20Пример использования
Вот пример использования конструкции list() в PHP:
Пример PHP list()
В этом примере конструкция list() присваивает значения массива $fruits переменным $fruit1, $fruit2 и $fruit3. Значение каждой переменной затем выводится на экран.
Пропуск элементов
Вы можете игнорировать ненужные значения, оставив соответствующий слот пустым. Присваиваются только те элементы, которые вы именуете:
<?php
$data = ['red', 'green', 'blue', 'yellow'];
// Grab only the third element; skip the rest
list(, , $third) = $data;
echo $third; // Output: blueДве ведущие запятые пропускают элементы 0 и 1, поэтому $third получает элемент 2 ("blue").
Вложенное деструктурирование
list() может быть вложен для распаковки многомерных массивов. Структура в левой части должна отражать структуру массива в правой части:
<?php
$coords = [[1, 2], [3, 4]];
[[$x1, $y1], [$x2, $y2]] = $coords;
echo "$x1,$y1 $x2,$y2"; // Output: 1,2 3,4Обмен переменных
Поскольку правая часть полностью вычисляется до присваивания, list() — это чистый способ поменять местами две переменные без использования временной:
<?php
$a = 'first';
$b = 'second';
[$a, $b] = [$b, $a];
echo "$a $b"; // Output: second firstРасширенное использование
Конструкцию list() также можно комбинировать с другими функциями PHP для более сложных задач. Например, она хорошо работает с explode() для разбиения строки на массив:
В этом примере explode() разбивает переменную $string на массив. Затем конструкция list() присваивает значения массива переменным $fruit1, $fruit2 и $fruit3. Значение каждой переменной затем выводится на экран.
Кроме того, list() поддерживает ассоциативные массивы, сопоставляя ключи с переменными:
<?php
$person = ['name' => 'Alice', 'age' => 30, 'city' => 'New York'];
list('name' => $name, 'age' => $age) = $person;
echo $name; // Output: Alice
echo $age; // Output: 30Обратите внимание, что ассоциативная форма требует, чтобы каждая переменная указывала свой ключ — нельзя смешивать ключевые и позиционные записи в одном list(). Эта форма особенно полезна при работе со структурированными данными, такими как JSON-ответы или строки базы данных.
Деструктурирование в цикле foreach
list() (или []) может располагаться непосредственно в позиции значения цикла foreach, распаковывая каждую строку по мере итерации. Это распространённый шаблон для массивов пар или записей:
<?php
$people = [
['Alice', 30],
['Bob', 25],
];
foreach ($people as [$name, $age]) {
echo "$name is $age\n";
}
// Output:
// Alice is 30
// Bob is 25Типичные подводные камни
list()работает только с массивами. Передача строки илиnullне деструктурирует её посимвольно; переменные просто устанавливаются вnull(с предупреждением дляnull).- Отсутствующие элементы дают
null. Если массив содержит меньше элементов, чем переменных, лишние переменные становятсяnullи PHP выдаёт предупреждениеUndefined array key. Убедитесь, что массив достаточно большой, или заранее используйте значение по умолчанию с оператором null-объединения. - Порядок присваивания не гарантирован. Не полагайтесь на то, какая переменная присваивается первой в одном
list(); никогда не пишите код, в котором одна цель зависит от того, что другая была присвоена раньше в том же выражении. - Нельзя смешивать ключевые и неключевые записи. В одном
list()либо каждая запись использует'key' => $var, либо ни одна.
Лучшие практики
- Используйте для именования частей массива, а не для создания массивов.
list()читает из массива; он никогда не создаёт его. Используйтеarray()/[], когда нужно создать данные. - Используйте осмысленные имена переменных.
[$id, $name, $email] = $row;документирует структуру$rowнамного лучше, чем$row[0],$row[1],$row[2], разбросанные по коду. - Предпочитайте краткий синтаксис
[]в PHP 7.1+ для единообразия с уже используемыми литералами массивов. - Используйте ключевую форму для ассоциативных данных, чтобы не зависеть молчаливо от порядка вставки.
Заключение
Конструкция list() (и её современный эквивалент []) позволяет деструктурировать массив в именованные переменные в одном выразительном выражении — по позиции, по ключу, вложенно или внутри foreach. Используйте её для придания осмысленных имён частям массивов, возвращаемых такими функциями, как explode(), и помните об описанных выше подводных камнях, чтобы отсутствующие или ошибочно напечатанные значения вас не удивили.