Деструктуризация массива в PHP

Ссылка на оригинал

Пост о том, как можно использовать list или [] для деструктуризации массива на переменные.

List или []

В PHP list или [] - это так называемые “языковые конструкциии”, также как и array(). И эти языковые конструкции используются для того, чтобы “вытащить” переменные из массива. Другими словами: деструктуризация массива на отдельные переменные.

Вот как это работает:

$array = [1, 2, 3]; 

// Using the list syntax:
list($a, $b, $c) = $array;

// Or the shorthand syntax:
[$a, $b, $c] = $array;

// $a = 1
// $b = 2
// $c = 3

Что вы предпочтете, list() или более короткое [], зависит от вас. Некоторые могут возразить, что квадратные скобки двусмысленны, так как они используются и для объявления массива и поэтому лучше предпочесть list(). Но в следующих примерах я буду использовать именно квадратные скобки.

Так что же еще можно сделать с помощью list?

Пропускать элементы

Например, вы хотите получить только третью переменную. Для этого объявление первых двух можно пропустить.

[, , $c] = $array;

// $c = 3

Также стоит заметить, что list всегда начинает отсчет с 0. Смотрим пример:

$array = [
    1 => 'a',
    2 => 'b',
    3 => 'c',
];

Первая переменная в list будет null, так как в массиве нет элемета с индексом 0. Это может показаться недостатком, но к с счастью, есть еще больше возможностей.

Нечисловые ключи

Начиная с версии PHP 7.1 в list можно использовать нечисловые ключи. Это открывает большие возможности.

$array = [
    'a' => 1,
    'b' => 2,
    'c' => 3,
];

['c' => $c, 'a' => $a] = $array;

Как вы видите, очередность можно менять, а также вообще не указывать некоторые элементы.

На практике

Одно из удобных мест использования list - это функции по типу parse_url и pathinfo. Так как они возвращают ассоциативные массивы, то мы можем получать только те данные, которые нам нужны.

[
    'basename' => $file,
    'dirname' => $directory,
] = pathinfo('/users/test/file.png');

Переменные не обязательно должны называться так же, как ключи. Но если вы попытаетесь использовать несуществующий ключ, то будет сгенерировано замечание.

[
    'path' => $path, 
    'query' => $query,
] = parse_url('https://stitcher.io/blog');

// PHP Notice:  Undefined index: query

В этом случае $query будет null.

И еще одна деталь: можно оставлять запятую после последнего элемента, точно также, как это работает в массивах.

В циклах

Конструкцию list также можно использовать и в циклах:

$array = [
    [
        'name' => 'a',
        'id' => 1
    ],
    [
        'name' => 'b',
        'id' => 2
    ],
];

foreach ($array as ['id' => $id, 'name' => $name]) {
    // …
}

Это может быть полезным при парсинге JSON или CSV. Однако будьте осторожны - несуществующие ключи будут генерировать замечания.

Вывод: в некоторых случаях конструкция list может быть крайне удобной!

Ссылка на оригинал

Дата публикации: 10.06.2020