2011-06-09 10 views
8

este código producir una salida inesperada:PHP instrucción foreach por referencia: comportamiento inesperado cuando la reutilización de iterador

$array=str_split("abcde"); 
foreach($array as &$item) 
    echo $item; 

echo "\n"; 
foreach($array as $item) 
    echo $item; 

de salida:

abcde 
abcdd 

si el uso de &$item segundo bucle todo funciona bien.

No entiendo cómo este código podría afectar el contenido de $array. Podría considerar que un unset($header) implícito eliminaría la última fila, pero ¿de dónde viene el doble dd?

Respuesta

11

Esto podría ayudar:

$array=str_split("abcde"); 
foreach($array as &$item) 
    echo $item; 

var_dump($array); 

echo "\n"; 
foreach($array as $item) { 
    var_dump($array); 
    echo $item; 
} 

Como se puede ver después de la última iteración $item se refiere al cuarto elemento de $array (e).

Después de eso iterar sobre la matriz y cambiar el 4 ° elemento a la actual. Entonces, después de la primera iteración del segundo ciclo será abcda, etc. a abcdd. Y en la última iteración, cambia el 4º elemento al 4º, como d a d

+0

gracias. ¿Hay alguna forma de "separar" $ ítem del 4 ° elemento después del primer ciclo? –

+2

@lenzai: 'unset ($ item);' --- es una práctica común desarmar la variable de referencia siempre y cuando ya no la necesite para evitar tales confusiones. – zerkms

+0

mi error, pensé unsset ($ item eliminaría $ array [4]. Supongo que estaba equivocado. –

Cuestiones relacionadas