PHP foreach: recorrer arreglos con pares clave-valor
PHP foreach es la forma idiomática de recorrer un arreglo o un objeto que implementa Traversable sin llevar un índice manualmente. Usa foreach ($array as $key => $value) cuando necesites la clave y el valor en cada iteración. Para actualizar en el propio arreglo, itera por referencia (&$value) y luego ejecuta unset() sobre la variable del bucle para evitar sobrescrituras accidentales.
Ejemplo de PHP foreach para iteración clave-valor
Salida:
La salida aparecerá aquí...
Salida:
manzana: $1.2
pan: $2.5
leche: $0.99
Cómo funciona este ejemplo
$precioses un arreglo asociativo que mapea nombres de productos a precios.foreach ($precios as $producto => $precio)asigna la clave actual a$productoy el valor actual a$precioen cada vuelta, sin índice manual nicount().- Cada iteración imprime el par clave-valor.
foreachmaneja arreglos indexados y asociativos con la misma sintaxis.
Errores comunes con PHP foreach
Olvidar unset() después de un bucle por referencia
Incorrecto:
foreach ($elementos as &$elemento) {
$elemento = strtoupper($elemento);
}
foreach ($elementos as $elemento) {} // sobrescribe el último elemento
Correcto:
foreach ($elementos as &$elemento) {
$elemento = strtoupper($elemento);
}
unset($elemento);
Después de un foreach por referencia, la variable del bucle todavía apunta al último elemento. Reutilizar esa variable puede hacer que se modifique el último elemento en lugar del valor local del bucle.
Esperar que los bucles por valor modifiquen el arreglo
Incorrecto:
foreach ($precios as $precio) {
$precio *= 1.10; // modifica una copia, no el arreglo
}
Correcto:
foreach ($precios as &$precio) {
$precio *= 1.10;
}
unset($precio);
La iteración por valor le da a cada $precio una copia del elemento. Los cambios en esa copia nunca llegan al arreglo original.
PHP foreach vs bucle for
| foreach | for |
|---|---|
| No necesita variable de índice, es más limpio para recorridos completos. | Es obligatorio cuando necesitas operaciones con índices, incrementos de paso o recorrido inverso. |
Funciona con arreglos asociativos y objetos Traversable. | Funciona solo con índices numéricos; las claves asociativas requieren array_keys(). |
| Es menos cómodo para avanzar por saltos (por ejemplo, un elemento sí y otro no). | Encaja de forma natural con $i += 2 o conteo hacia atrás. |
Usa foreach para recorridos completos estándar de arreglos. Cambia a for cuando el cuerpo del bucle depende de la posición numérica o de un acceso no secuencial.
FAQ
¿Cómo obtienes tanto la clave como el valor en un bucle foreach de PHP?
Usa la sintaxis $key => $value: foreach ($array as $key => $value). Esto asigna la clave ($key) y el valor ($value) en cada iteración, tanto para arreglos indexados como asociativos. Si solo necesitas valores, usa foreach ($array as $value).
¿foreach puede iterar objetos, o solo arreglos?
foreach funciona sobre cualquier valor que implemente la interfaz Traversable, incluyendo implementaciones de Iterator e IteratorAggregate. En objetos simples, itera sobre propiedades visibles según el alcance: todas las propiedades dentro de la clase y solo las public desde fuera.
¿Cuál es la diferencia entre foreach y array_map en PHP?
foreach es una estructura de control que ejecuta un bloque por cada elemento y permite efectos secundarios como echo o un break temprano. array_map aplica un callback y devuelve un arreglo nuevo. Usa array_map cuando quieras un arreglo nuevo y sin mutaciones.