foreach
El bucle foreach en PHP itera sobre arrays y objetos de forma sencilla. Aprende su sintaxis, referencia y uso de list().
El bucle foreach en PHP
foreach es el bucle dedicado de PHP para iterar sobre arrays y objetos. A diferencia de un bucle for, no necesita un contador ni un índice — recorre cada elemento automáticamente, uno a la vez, lo que lo convierte en la forma más común y menos propensa a errores para procesar una colección en PHP.
Este capítulo cubre las dos formas de foreach, la iteración por referencia, el desempaquetado de arrays anidados con list(), el error más común, y cuándo elegir foreach sobre los demás bucles de PHP.
Sintaxis
foreach tiene dos formas.
Solo valor — cuando solo te importa el valor de cada elemento:
foreach ($array as $value) {
// do something with $value
}Clave y valor — cuando también necesitas la clave del array (esencial para los arrays asociativos):
foreach ($array as $key => $value) {
// do something with $key and $value
}En cada pasada, PHP copia el elemento actual en $value (y su clave en $key), luego avanza al siguiente elemento hasta que el array se agota.
Iteración sobre un array indexado
Iteración sobre un array asociativo
Con la forma $key => $value obtienes ambas mitades de cada par:
<?php
$person = ["name" => "John", "age" => 30, "city" => "New York"];
foreach ($person as $key => $value) {
echo $key . ": " . $value . PHP_EOL;
}
// Output:
// name: John
// age: 30
// city: New YorkModificar valores por referencia
Por defecto, $value es una copia, por lo que modificarla dentro del bucle no afecta al array original. Antepón & para iterar por referencia y que los cambios se escriban de vuelta:
<?php
$prices = [10, 20, 30];
foreach ($prices as &$price) {
$price *= 2; // modifies the array in place
}
unset($price); // important: break the reference
print_r($prices);
// Output:
// Array
// (
// [0] => 20
// [1] => 40
// [2] => 60
// )Precaución: siempre usa
unset($price)después de un bucle por referencia. La variable sigue apuntando al último elemento, por lo que una asignación posterior a$price— o un segundoforeachque reutilice el nombre — corrompería silenciosamente el array.
Desempaquetar arrays anidados con list()
Cuando cada elemento es a su vez un array, puedes desestructurarlo en línea usando list() (o la sintaxis corta [] en PHP 7.1+):
<?php
$points = [[1, 2], [3, 4], [5, 6]];
foreach ($points as [$x, $y]) {
echo "x=$x, y=$y" . PHP_EOL;
}
// Output:
// x=1, y=2
// x=3, y=4
// x=5, y=6Cuándo usar foreach
- Usa
foreachpara cualquier array o iterable cuando quieras recorrer todos los elementos — es la opción más clara y no puede salirse del límite del array. - Usa un bucle
forcuando necesites control preciso sobre el contador (saltar elementos, avanzar de 2 en 2, contar hacia atrás). - Usa
whilecuando el número de iteraciones no se conoce de antemano y depende de una condición.
También puedes salir de un foreach antes de tiempo con break o saltar una iteración con continue, exactamente igual que en otros bucles.