List: примеры (PHP)

Извлечение элементов массива с помощью list и [] в PHP
Раздел: Работа с переменными
list(array $array): array
Функция list в PHP: основы и аргументы

Конструкция list() или ее синтаксический аналог [] (начиная с PHP 7.1) применяется для деструктуризации массивов. Она позволяет присвоить значения из массива нескольким переменным за одну операцию. Использование целесообразно, когда требуется извлечь элементы массива, особенно из функций, возвращающих списки значений.

Аргументами функции выступают переменные, разделенные запятыми. С PHP 7.1 можно указывать ключи массива для извлечения конкретных элементов. Начиная с PHP 7.3, аргументы разрешено завершать запятой.

Краткие примеры работы с list
Простое присваивание
list($a, $b) = [10, 20];
echo "a: $a, b: $b";
// Альтернативный синтаксис:
[$c, $d] = [30, 40];
echo " c: $c, d: $d";
a: 10, b: 20 c: 30, d: 40
Пропуск элементов
list(, $second, , $fourth) = ['a', 'b', 'c', 'd'];
echo "second: $second, fourth: $fourth";
second: b, fourth: d
Указание ключей (с PHP 7.1)
$data = ['id' => 5, 'name' => 'Иван'];
['name' => $userName, 'id' => $userId] = $data;
echo "$userName имеет id $userId";
Иван имеет id 5
Похожие возможности в PHP

Деструктуризация через [] – начиная с PHP 7.1, квадратные скобки выполняют ту же роль, что и list(), с более лаконичным синтаксисом. Предпочтительнее в новом коде.

Функция each() – устарела в PHP 7.2 и удалена в 8.0. Использовалась для итерации по массиву с возвратом ключа и значения.

Функция extract() – импортирует элементы ассоциативного массива в текущую таблицу символов. Считается небезопасной из-за возможного переопределения переменных, применение не рекомендуется.

Типичные ошибки
Попытка деструктуризации не массива
$var = null;
list($a, $b) = $var; // Ошибка в PHP до 7.1
// Начиная с PHP 7.1 – предупреждение, переменные получат null
Warning: Undefined array key 0
Warning: Undefined array key 1
Использование с ассоциативными массивами без указания ключей (до PHP 7.1)
$assoc = ['one' => 1, 'two' => 2];
list($x, $y) = $assoc;
echo "$x $y"; // Ожидается 1 2, но работает только с числовыми ключами
  (пустой вывод, так как $x и $y не получат значения)
Несоответствие количества переменных и элементов
[$a, $b, $c] = [100, 200];
echo "$a, $b, $c"; // $c будет undefined
100, 200,
История изменений

PHP 7.1 – введен синтаксис квадратных скобок [] как альтернатива list(). Добавлена возможность указывать ключи при деструктуризации ассоциативных массивов. Теперь list() может работать с объектами, реализующими интерфейс ArrayAccess.

PHP 7.3 – разрешена завершающая запятая в списке аргументов list().

PHP 8.1 – деструктуризация поддерживается для массивов, содержащих ссылки, с помощью нового синтаксиса [&$a, $b] = $arr.

Расширенные примеры применения
Обмен значений переменных
Пример php
$x = 5;
$y = 10;
[$x, $y] = [$y, $x];
echo "x: $x, y: $y";
x: 10, y: 5
Обработка вложенных массивов
Пример php
$matrix = [
    [1, 2, 3],
    [4, 5, 6]
];

foreach ($matrix as list($first, $second)) {
    echo "first: $first, second: $second\n";
}
// Или с []:
foreach ($matrix as [$first, $second]) {
    echo "$first - $second\n";
}
first: 1, second: 2
first: 4, second: 5
1 - 2
4 - 5
Извлечение значений из функции, возвращающей массив
Пример php
function getCoordinates() {
    return [45.123, 38.456];
}

[$lat, $lon] = getCoordinates();
echo "Широта: $lat, Долгота: $lon";
Широта: 45.123, Долгота: 38.456
Использование с ссылками (PHP 8.1)
Пример php
$arr = [1, 2, 3];
[&$ref, $b, $c] = $arr;
$ref = 100;
print_r($arr); // Изменится первый элемент исходного массива
Array
(
    [0] => 100
    [1] => 2
    [2] => 3
)
Деструктуризация с пропусками и ключами
Пример php
$config = [
    'db_host' => 'localhost',
    'db_user' => 'root',
    'db_pass' => 'secret',
    'cache' => true
];

['db_host' => $host, 'db_user' => $user, 'db_pass' => $pass] = $config;
echo "Подключение к $host с пользователем $user";
Подключение к localhost с пользователем root
Деструктуризация в других языках

List в Javascript

const arr = [1, 2, 3];
const [first, second] = arr;
console.log(first, second); // 1 2

const obj = {x: 10, y: 20};
const {x, y} = obj;
console.log(x, y); // 10 20
1 2
10 20

В JavaScript деструктуризация работает для массивов и объектов, синтаксис похож на PHP, но более развит (значения по умолчанию, вложенность).

List в Python

lst = [7, 8, 9]
a, b, c = lst
print(a, b, c) # 7 8 9

# Распаковка со звездочкой
first, *rest = [1, 2, 3, 4]
print(first, rest) # 1 [2, 3, 4]
7 8 9
1 [2, 3, 4]

В Python деструктуризация (распаковка) поддерживается для любых итерируемых объектов, включает оператор * для захвата нескольких элементов.

List в MySQL

Прямого аналога нет. Для извлечения значений из строки результата запроса используются операции SELECT ... INTO или присваивание в процедурах.

PHP list function comments

En
List Assign variables as if they were an array