Cambios relacionados con foreach
En esta página
Cambios relacionados con foreach#
Se han realizado cambios menores en el comportamiento de la estructura de control foreach, principalmente en la gestión del puntero interno del array y la modificación del array mientras se recorre.
foreach ya no modifica el puntero interno del array#
Antes de PHP 7, el puntero interno del array se modificaba mientras se recorría un array con foreach. Esto ya no es así, como se muestra en el siguiente ejemplo:
<?php
$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump(current($array));
}
?>
Resultado del ejemplo anterior en PHP 5:
int(1)
int(2)
bool(false)
Resultado del ejemplo anterior en PHP 7:
int(0)
int(0)
int(0)
foreach por valor trabaja sobre una copia del array#
Al utilizar el modo predeterminado (por valor), foreach ahora trabaja sobre una copia del array en lugar del array original. Esto significa que los cambios realizados en el array mientras se recorre no afectarán los valores que se están iterando.
Se ha mejorado el comportamiento de foreach por referencia#
Al recorrer un array por referencia, foreach ahora identifica mejor los cambios realizados en el array durante la iteración. Por ejemplo, si se añaden valores a un array mientras se recorre, estos nuevos valores también se iterarán:
<?php
$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}
?>
Resultado del ejemplo anterior en PHP 5:
int(0)
Resultado del ejemplo anterior en PHP 7:
int(0)
int(1)
Iteración de objetos no-Traversable#
La iteración de un objeto no-Traversable ahora es idéntica a la iteración de un array por referencia. Como resultado, la mejora en el comportamiento cuando se modifica un array durante su iteración también se aplica cuando se añaden o eliminan propiedades de un objeto.