Menu

PHP list() e desestruturação de arrays: [$a, $b] = $arr

[$a, $b] = $array atribui os dois primeiros elementos a $a e $b numa linha, e ['name' => $name] = $user faz o mesmo pela chave. list() é a grafia antiga. Veja como pular elementos, trocar variáveis, retornar vários valores, desestruturar no foreach e o operador spread ....

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

[$a, $b] = $array; separa os elementos de um array em variáveis numa linha: $a recebe $array[0], $b recebe $array[1]. list($a, $b) = $array; é a grafia antiga da mesma coisa, e ['name' => $name] = $user; faz isso pela chave.

Combinar desestruturação com explode() é o uso clássico: divida uma string, dê nome às partes e siga em frente.

Pular elementos

Deixe uma posição vazia para pulá-la. Você também pode parar antes: elementos não usados no fim são ignorados.

Desestruturar um array associativo pela chave

Com chaves, a ordem no array não importa e você pega só os campos de que precisa. A chave vem antes de =>, a variável depois.

Os padrões se aninham do mesmo jeito para listas: [[$x1, $y1], [$x2, $y2]] = $line; lê dois pontos de uma vez. Desde o PHP 7.3, uma variável num padrão também pode ser uma referência, [, &$second] = $counts;, então alterar $second altera o array.

Uma atribuição usa posições ou chaves, nunca as duas. [$a, 'k' => $b] = $arr; para com Cannot mix keyed and unkeyed array entries in assignments.

Trocar duas variáveis

Monte um array com os dois valores na ordem inversa e desestruture de volta. Sem variável temporária.

Retornar vários valores de uma função

Uma função PHP retorna um valor, mas esse valor pode ser um array. Desestruturar na chamada faz parecer que são vários valores de retorno. Para mais de dois ou três valores, retorne chaves para que quem chama não confunda a ordem.

Desestruturação no foreach

A mesma sintaxe funciona na linha do foreach, então cada linha já chega separada em variáveis com nome. É isso que as pessoas chamam de "foreach com list()". Mais padrões de loop estão na página sobre foreach.

O operador spread (...)

Os três pontos desempacotam um array no lugar. Num literal de array, [...$a, ...$b] junta arrays. Numa chamada de função, f(...$args) passa os elementos como argumentos separados. Na definição de uma função, ...$args reúne os argumentos extras num array.

Antes do PHP 8.1, espalhar um array com chaves string era erro; agora as chaves string são mantidas e as numéricas renumeradas, com as mesmas regras do array_merge(). Parâmetros variádicos como ...$amounts são explicados junto com os outros tipos de parâmetro na página sobre funções.

Erro comum: menos elementos que variáveis

Se o array for menor que o padrão, as variáveis que faltam viram null e o PHP imprime um aviso para cada uma. Isso acontece com entrada que você não controla, como uma linha com campos faltando. Para [$name, $city, $country] = explode(',', 'Grace'); o PHP imprime:

Warning: Undefined array key 1 in /var/www/html/import.php on line 5

Warning: Undefined array key 2 in /var/www/html/import.php on line 5

Decida o que uma parte ausente deve ser e complete o array antes de desestruturar:

Para padrões com chave, junte os padrões antes: ['a' => $a, 'b' => $b] = $input + ['a' => null, 'b' => null];. O operador + só adiciona as chaves que $input ainda não tem.

Perguntas frequentes

O que faz o list() no PHP?

list($a, $b) = $array; atribui $array[0] a $a e $array[1] a $b. Desde o PHP 7.1, a forma curta [$a, $b] = $array; faz exatamente o mesmo, e as duas formas aceitam chaves: ['id' => $id] = $row;.

Como troco o valor de duas variáveis no PHP?

Desestruture um novo array feito com elas na ordem inversa: [$a, $b] = [$b, $a];. Não é preciso variável temporária.

Posso usar list() com um array associativo no PHP?

Sim, desde o PHP 7.1. Informe as chaves: ['name' => $name, 'email' => $email] = $user; ou list('name' => $name) = $user;. Sem chaves, [$a, $b] = $user; procura as chaves 0 e 1 e recebe null com um aviso.

O que são os três pontos (...) no PHP?

O operador spread. Num literal de array, [...$a, ...$b] copia os elementos dos dois arrays para um novo. Numa chamada, max(...$numbers) passa os elementos como argumentos separados. Na definição de uma função, function sum(...$numbers) reúne qualquer quantidade de argumentos num array.

O que acontece se o array tiver menos elementos que as variáveis do list()?

As variáveis extras recebem null, e o PHP imprime um aviso como Undefined array key 2. Complete o array antes, por exemplo [$a, $b, $c] = array_pad($parts, 3, null);.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR