PHP para cada passagem por referência: Faça certo, ou melhor não.

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, $entryainda é 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 foreachloops que precisam manipular a matriz original da maneira normal:

foreach($data as $index => $entry) {
// $data[$index] = ...
}