razones qué queriendola que pareja para murió molesta magno hijos hay haces esta dejar cuando como cansada alejandro php arrays foreach

php - qué - Comportamiento extraño de foreach



dejar a tu pareja queriendola (2)

El primer bucle foreach no realiza ningún cambio en la matriz, tal como cabría esperar. Sin embargo, causa que a $v se le asigne una referencia a cada elemento de $a , de modo que, en el momento en que finaliza el primer ciclo, $v es, de hecho, una referencia a $a[2] .

Tan pronto como se inicia el segundo ciclo, $v ahora tiene asignado el valor de cada elemento. Sin embargo, $v ya es una referencia a $a[2]; por lo tanto, cualquier valor asignado se copiará automáticamente en el último elemento de la matriz.

Por lo tanto, durante la primera iteración, $a[2] se convertirá en cero, luego en uno, y luego en uno nuevamente, siendo efectivamente copiado sobre sí mismo. Para resolver este problema, siempre debe desarmar las variables que usa en sus bucles foreach de referencia, o, mejor aún, evitar usar el anterior por completo.

<?php $a = array(''a'', ''b'', ''c'', ''d''); foreach ($a as &$v) { } foreach ($a as $v) { } print_r($a); ?>

Creo que es un programa normal, pero este es el resultado que obtengo:

Array ( [0] => a [1] => b [2] => c [3] => c )

¿Alguien puede explicarme esto?


Este es un comportamiento de PHP bien documentado. Vea la warning en la página de foreach de php.net.

Advertencia

La referencia de $ valor y el último elemento de matriz permanecen incluso después del bucle foreach . Se recomienda destruirlo por unset ().

$a = array(''a'', ''b'', ''c'', ''d''); foreach ($a as &$v) { } unset($v); foreach ($a as $v) { } print_r($a);

EDITAR

Intente una guía paso a paso de lo que realmente está sucediendo aquí

$a = array(''a'', ''b'', ''c'', ''d''); foreach ($a as &$v) { } // 1st iteration $v is a reference to $a[0] (''a'') foreach ($a as &$v) { } // 2nd iteration $v is a reference to $a[1] (''b'') foreach ($a as &$v) { } // 3rd iteration $v is a reference to $a[2] (''c'') foreach ($a as &$v) { } // 4th iteration $v is a reference to $a[3] (''d'') // At the end of the foreach loop, // $v is still a reference to $a[3] (''d'') foreach ($a as $v) { } // 1st iteration $v (still a reference to $a[3]) // is set to a value of $a[0] (''a''). // Because it is a reference to $a[3], // it sets $a[3] to ''a''. foreach ($a as $v) { } // 2nd iteration $v (still a reference to $a[3]) // is set to a value of $a[1] (''b''). // Because it is a reference to $a[3], // it sets $a[3] to ''b''. foreach ($a as $v) { } // 3rd iteration $v (still a reference to $a[3]) // is set to a value of $a[2] (''c''). // Because it is a reference to $a[3], // it sets $a[3] to ''c''. foreach ($a as $v) { } // 4th iteration $v (still a reference to $a[3]) // is set to a value of $a[3] (''c'' since // the last iteration). // Because it is a reference to $a[3], // it sets $a[3] to ''c''.