Este é um exemplo de porque a passagem por referência em loops foreach é RUIM.
$data = array(1,2,3,4);
foreach($data as &$entry) {
// $entry = ...
}
echo '$data = ';
print_r($data);
/* later in your code, totally unrelated */
$test = array(10,20,30,40);
foreach($test AS $entry) {
//
}
echo '$data = ';
print_r($data);
/**
* Expected: array(1,2,3,4)
* Actual: array(1,2,3,40)
**/
Isso ocorre porque, quando o segundo loop é executado, $entry
ainda é uma referência.
Portanto, a cada iteração, a referência original é substituída.
Você pode consertar isso chamando
unset($entry);
após o loop de passagem por referência. Portanto, se você alguma vez for usar esse estilo de codificação, não se esqueça de remover a variável de referência após o loop .
No entanto, acho melhor evitar essa armadilha e apenas escrever foreach
loops que precisam manipular a matriz original da maneira normal:
foreach($data as $index => $entry) {
// $data[$index] = ...
}