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!