Hoy vamos a hablar de lo que parece un bug del foreach de PHP pero como comprobaremos no lo es tanto…
Supongamos que tenemos el siguiente código
<?php $array = array('foo', 'bar'); foreach ($array as &$valor); foreach ($array as $valor); var_dump($array); ?>
¿Que creéis que pasa? Pues aunque parezca increíble este es el resultado:
<?php array(2) { [0]=> string(3) "foo" [1]=> &string(3) "foo" } ?>
Evidentemente lo primero que se te pasa por la cabeza es que es un bug de PHP, pero no, está documentado en php.net y la respuesta a dicho comportamiento es que la referencia del $valor y el último elemento del array permanecen aún después del bucle foreach.
Por lo tanto lo que nos recomiendan en estos casos es usar la función unset() para evitar problemas.