Pular para o conteúdo principal

Entenda o & comercial na variável do foreach do PHP

Entenda o & comercial na variável do foreach do PHP - Publicado por: Wellington Pragidi Desenvolvedor Web

PHP: Por que e quando faz diferença usar o & comercial na variável $value do foreach

Quando usamos foreach em PHP, geralmente pensamos que ele apenas percorre o array e copia cada valor para a variável temporária.
Mas, se adicionarmos um simples & (e comercial) antes da variável, o comportamento muda completamente — e é aí que muita gente tropeça.

Explicação direta

Sem referência ( foreach ($array as $value) )
PHP faz uma cópia temporária de cada valor.
Alterar $value não afeta o array original.

$names = ['Well', 'Cynthia', 'Boot'];

foreach( $names as $name ) {
    $name = strtoupper( $name );
}

print_r( $names );
// ['Well', 'Cynthia', 'Boot'] - nada mudou


Com referência ( foreach ($array as &$value) )
Agora $value é um ponteiro para o elemento real dentro do array.
Alterar $value altera o array original.

$names = ['Well', 'Cynthia', 'Boot'];

foreach( $names as &$name ) {
    $name = strtoupper($name);
}

print_r( $names );
// ['WELL', 'CYNTHIA', 'BOOT'] - agora sim, todos mudaram

Armadilha comum

Após usar &$value, a variável continua referenciando o último item do array.
Então, se você usar $value depois do foreach, pode alterar o último valor sem perceber.

foreach( $names as &$name ) {
    // ...
}
$name = 'Zoe';
print_r( $names );
// ['WELL', 'CYNTHIA', 'Zoe']

Depois de um foreach com &, a variável $nome continua ligada por referência ao último elemento do array.
Por isso, é fortemente recomendado limpar com:

unset( $name );

Assim, cada subitem já sai com o ID do pai definido sem criar arrays adicionais.

Conclusão

O & no foreach parece um detalhe pequeno, mas muda o comportamento do PHP profundamente.
Entender quando usar (e quando não usar) é o tipo de coisa que diferencia quem só escreve PHP de quem realmente entende como o PHP funciona.

Categoria: PHP