Symmetric array destructuring (Desestruturação de Matriz Simétrica), a grosso modo nada mais é do que desmembrar e manipular um array e para isso o PHP conta com um recurso que se chama “list”. A função list(), que na verdade não se trata de uma função mas sim um construtor de linguagem, é utilizada para criar variáveis como se fossem arrays, caso não conheça esse recurso ou não lembre vou mostrar alguns exemplos.
list($a, $b, $c) = ['foo', 'bar', 'baz']; echo $a; // "foo" echo $b; // "bar" echo $c; // "baz"
A ideia é bem simples, agora veja um caso onde é omitida a última variável.
list($a, $b) = ['foo', 'bar', 'baz']; echo $a; // "foo" echo $b; // "bar"
Como pode ver ele simplesmente não irá associar o último valor. Mas e se não passarmos um dos valores do array?
list($a, $b, $c) = ['foo', 'bar']; echo $a; // "foo" echo $b; // "bar" echo $c; // Undefined offset: 1
Uma chamada Undefined offset será lançada na variável que sobrou.
Bem, agora veja um exemplo onde queremos saltar o índice 1 do array.
list($a, , $b) = ['foo', 'bar', 'baz']; echo $a; // "foo" echo $b; // "baz"
Bom, essa função é bem simples de se usar e no PHP 7.1 é possível especificar o índice do array que queremos desempacotar em uma matriz associativa.
$person = [ 'name' => 'Sebastian', 'job' => 'Developer', ]; list('job' => $job) = $person; echo $job; // "Developer"
Você também pode usar o recurso dentro de um loop. Como por exemplo um foreach.
$people = [ ['name' => 'Freek', 'role' => 'Developer'], ['name' => 'Sebastian', 'role' => 'Developer'], ['name' => 'Willem', 'role' => 'Designer'], ]; $names = []; foreach ($people as $person) { list('name' => $names[]) = $person; } var_dump($names); // ["Freek", "Sebastian", "Willem"];
Também na versão 7.1 temos uma sintaxe alternativa para essa funcionalidade, que além ser mais concisa ela não se assemelha a uma chamada de função, evitando mal-entendidos de novos usuários.
// Antes do PHP 7.1 list($a, $b, $c) = ['foo', 'bar', 'baz']; // Depois do PHP 7.1 [$a, $b, $c] = ['foo', 'bar', 'baz'];
Como você pode observar agora podemos passar no lugar de list apenas os símbolos [ ]. Caso você não tenha gostado dessa nova maneira de usar o list() você pode continuar usando da maneira tradicional, pois pelo menos até o PHP 7.1 o list ainda é suportado.
Abaixo está um exemplo um pouco mais elaborado do que é possível fazer este recurso.
$produce = [ [1, 'apple', 'fruit'], [2, 'banana', 'fruit'], [3, 'carrot', 'vegetable'], ]; $mappedProduce = []; foreach ($produce as [$id, $name, $type]) { $mappedProduce[] = [ 'id' => $id, 'name' => $name, 'type' => $type, ]; } print_r($mappedProduce); // result // Array // ( // [0] => Array // ( // [id] => 1 // [name] => apple // [type] => fruit // ) // [1] => Array // ( // [id] => 2 // [name] => banana // [type] => fruit // ) // [2] => Array // ( // [id] => 3 // [name] => carrot // [type] => vegetable // ) // )
Com a nova sintaxe para desestruturar uma matriz significa que agora há simetria entre construção de matriz e desestruturação, o que deve tornar mais claro qual é a função da sintaxe:
list($a, $b, $c) = array(1, 2, 3); [$a, $b, $c] = [1, 2, 3]; list("a" => $a, "b" => $b, "c" => $c) = array("a" => 1, "b" => 2, "c" => 3); ["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3]; list($a, $b) = array($b, $a); [$a, $b] = [$b, $a];
Acredito que com esse exemplo acima você deva ter conseguido sacar a diferença na simetria entre a nova e antiga sintaxe. Mas saiba que devido a questões de implementação, e por razões de consistência, list() não pode ser aninhado dentro de [], nem vice-versa:
// Isto não é permitido: list([$a, $b], [$c, $d]) = [[1, 2], [3, 4]]; // Isto também não é permitido: [list($a, $b), list($c, $d)] = [[1, 2], [3, 4]]; // Isso, no entanto, é permitido: [[$a, $b], [$c, $d]] = [[1, 2], [3, 4]];
A Desestruturação de matriz simétrica é um termo incrivelmente confuso para um conceito simples, a simetria entre construção e desestruturação é uma característica de muitas outras linguagens. Um exemplo seria o código $array = [1, 2, 3], que é válido ECMAScript 6 e comportar-se de forma idêntica em PHP.
Espero ter ajudado com este post e qualquer sugestão ou dúvida deixe seu comentário.
Referências.
php.net
sebastiandedeyne.com
wiki.php.net
laracasts.com