En la primera entrada del Uso de Foreach y For hablaba sobre el uso del bucle for
Veamos primero la definición del constructor foreach en la documentación de PHP:
Constructor Foreach
El constructor foreach proporciona un modo sencillo de iterar sobre arrays. foreach funciona sólo sobre arrays y objetos, y emitirá un error al intentar usarlo con una variable de un tipo diferente de datos o una variable no inicializada. Existen dos sintaxis:
foreach (expresión_array as $valor) sentencias foreach (expresión_array as $clave => $valor) sentencias
La primera forma recorre el array dado por expresión_array. En cada iteración, el valor del elemento actual se asigna a $valor y el puntero interno del array avanza una posición (así en la próxima iteración se estará observando el siguiente elemento).
La segunda forma además asigna la clave del elemento actual a la variable $clave en cada iteración.
Recorrer Arrays
Tal como dice la definición foreach nos sirve para recorrer arrays de una manera sencilla, bastante mas sencilla que con el bucle for, ya que no necesitamos conocer la longitud del array para recorrerla y el array puede tener claves tanto numéricas como no numéricas.
$array = array('Uno'=>'Hola', 'Dos'=>'Mundo, 'Tres' => 'Hello'); // Mostramos todas los valores del array foreach ($array as $var) { echo $var.PHP_EOL; } // Mostramos todas las claves y los valores del array foreach ($array as $key => $var) { echo $key . " " . $var . PHP_EOL; }
Recorrer objetos
Otra de las características que tiene foreach es la posibilidad de iterar sobre objetos, es decir, podriamos mostrar por pantalla todas las propiedades de un objeto.
$coche = new stdClass(); $coche->color = 'rojo'; $coche->ruedas = '4'; $coche->puertas = '3'; $coche->combustible = 'gasolina'; foreach ($coche as $key => $var) { echo $key. " " . $var .PHP_EOL; }
¿Podemos modificar los valores del array/objeto usando el foreach?
La respuesta es si, aunque con matices. Cuando recorremos un array o un objeto con foreach no recorremos el objeto en si sino una copia de ese objeto la cual se destruye una vez finalizada la iteración. Para poder modificar los valores tenemos que pasar el valor por referencia
foreach ($coche as $key => &$var) { $var = $var." modificado"; }
Aqui el bucle foreach nos recorrería el array/objeto $coche y modificaría sus valores añadiendo «modificado» al final de cada uno de ellos.
Referenciar $var sólo es posible si el array iterado puede ser referenciado (es decir, si es una variable). El siguiente código no funcionará:
foreach ( array(1, 2, 3) as &var) { $var = $var * 2; }
Es decir, el array/objeto tiene que estar definido fuera del foreach para que pueda ser referenciado.
Utilizar arrays anidados con list PHP >= 5.5.0
Una de las novedades de la versión 5.5.0 de PHP es la posibilidad de recorrer un array de arrays y utilizar el array interior en las variables del bucle proporcionando list() como el valor.
// Este codigo solo funciona con PHP >= 5.5.0 $array = [ [1, 2], [3, 4], ]; foreach ($array as list($a, $b)) { // $a contiene el primer elemento del array interior, // y $b contiene el segundo elemento. echo "A: $a; B: $b\n"; } /* Mostrara A: 1; B: 2 A: 3; B: 4 */