If you enjoy reading my blog, you could consider supporting me on Patreon.

Array destructuring in PHP

# List or []

In PHP, list or [] is a so called "language construct", just like array(). This language construct is used to "pull" variables out of an array. In other words: it will "destructure" the array into separate variables.

Note that the word is "destructure", not "destruction" — that's something different 😉

Here's what that looks like:

$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

Whether you prefer list or its shorthand [] is up to you. People might argue that [] is ambiguous with the shorthand array syntax, and therefor prefer list. I'll be using the shorthand version in code samples though.

So what more can list do?

# Skip elements

Say you only need the third element of an array, the first two can be skipped by simply not providing a variable.

[, , $c] = $array;

// $c = 3

Also note that list will always start at index 0. Take for example the following array:

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

The first variable pulled out with list would be null, because there's no element with index 0. This might seem like a shortcoming, but luckily there are more possibilities.

# Non-numerical keys

PHP 7.1 allows list to be used with arrays that have non-numerical keys. This opens a world of possibilities.

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

As you can see, you can change the order however you want, and also skip elements entirely.

# In practice

One of the uses of list are functions like parse_url and pathinfo. Because these functions return an array with named parameters, we can use list to pull out the information we'd like:

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

As you can see, the variables don't need the same name as the key. Also note that destructuring an array with an unknown key will trigger a notice:

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

// PHP Notice:  Undefined index: query

In this case, $query would be null.

One last detail: trailing commas are allowed with named destructs, just like you're used to with arrays.

# In loops

You can also use the list construct in loops:

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

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

This could be useful when parsing for example a JSON or CSV file. Be careful though that undefined keys will still trigger a notice.

In summary, there are some pretty good cases in which list can be of help!

Would you like to stay up to date about new content? Feel free to subscribe to my newsletter and follow me on Twitter. Noticed a tpyo? You can submit a PR to fix it.