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