foreach ($arr as $arr) {
// code
}
Esto puede ser confuso para usted porque su modelo mental de cómo funciona esto es:
- PHP toma el elemento actual de
$arr
y avanza el puntero
- asigna el valor a
$arr
- ejecuta
// code
- se repite desde el paso uno
lo que realmente hace es sin embargo esto (o, al menos, una simplificación aproximada de la misma):
- PHP inicia la operación
foreach
, teniendo la valor de matriz que está asociado con $arr
- pone esta matriz en algún lugar internamente, digamos un
var iterator
- que toma s el elemento actual de
var iterator
y avanza el iterador
- asigna el valor que se tardó en
$arr
en el script
- ejecuta
// code
- se repite desde el paso 3
En otras palabras, se hace no tome el siguiente valor desde $arr
en cada iteración, solo lo usó una vez para obtener el iterador inicial. La cosa real que itera se almacena internamente y ya no está asociada con $arr
. Eso significa que $arr
es gratuito para otros fines en su secuencia de comandos y PHP se complace en reutilizarlo en cada iteración. Una vez hecho el ciclo, el último elemento permanece en $arr
.
Si conoces funciones anónimas, tal vez esto ilustra mejor por qué esto funciona de la forma en que funciona:
foreach($arr, function ($arr) {
// code
});
La implementación de una función de este tipo foreach
puede ser simplemente esto:
function foreach(array $array, callable $code) {
while (list(, $value) = each($array)) {
$code($value);
}
}
Eso es definitivamente una salida sorprendente. –
doesnt php de alguna manera almacena en caché el contenido del $ arr original (el arreglo), luego mientras se repite, cambia y muestra el $ arr (como 1, 2 y 3), luego al final el $ arr queda como "3" , ya que simplemente no guarda el valor almacenado en caché, vuelve al archivo original, porque php no espera que lo anule ... –
Es sorprendente. –