Curso de PHP
Estructuras repetitivas for y foreach en PHP
Por Víctor Peña · Publicado el

Hola, ¿cómo están? Continuando con el curso de PHP, hoy veremos los bucles for y foreach. Si en la lección anterior vimos los bucles más básicos, estos dos son los que vas a usar de verdad en el día a día.
¡Empecemos!
El bucle for
for reúne en una sola línea las tres piezas que en while estaban repartidas: la inicialización, la condición y el incremento.
<?php
for ($i = 1; $i <= 5; $i++) {
echo "Vuelta $i\n";
}
Las tres partes, separadas por punto y coma:
$i = 1— se ejecuta una sola vez, al empezar.$i <= 5— se comprueba antes de cada vuelta.$i++— se ejecuta al final de cada vuelta.
Compáralo con el while equivalente y verás por qué se prefiere: al tener todo junto, es imposible olvidar el incremento y provocar un bucle infinito.
Variantes útiles
<?php
// Contar hacia atrás
for ($i = 10; $i >= 1; $i--) {
echo $i . " ";
}
// Avanzar de dos en dos
for ($i = 0; $i <= 20; $i += 2) {
echo $i . " ";
}
Cuándo usar for: cuando sabes cuántas vueltas necesitas, o cuando necesitas el número de la vuelta para algo.
El bucle foreach
foreach está hecho específicamente para recorrer arrays, y es con diferencia el bucle más usado en PHP.
<?php
$colores = ["rojo", "verde", "azul"];
foreach ($colores as $color) {
echo $color . "\n";
}
Sin contadores, sin condiciones, sin riesgo de pasarse del último elemento. PHP recorre todos los elementos y en cada vuelta guarda el actual en $color.
Recorrer arrays asociativos
Cuando el array tiene claves con nombre, puedes capturar la clave y el valor:
<?php
$persona = [
"nombre" => "Víctor",
"ciudad" => "Cochabamba",
"edad" => 35,
];
foreach ($persona as $clave => $valor) {
echo "$clave: $valor\n";
}
Salida:
nombre: Víctor
ciudad: Cochabamba
edad: 35
Esta forma es la que más vas a usar cuando trabajes con datos de una base de datos, porque cada registro llega justamente como un array asociativo.
Arrays de arrays
En un caso real, una consulta devuelve varios registros:
<?php
$productos = [
["nombre" => "Teclado", "precio" => 120],
["nombre" => "Monitor", "precio" => 850],
["nombre" => "Mouse", "precio" => 60],
];
foreach ($productos as $producto) {
echo $producto["nombre"] . " cuesta " . $producto["precio"] . "\n";
}
Este patrón —recorrer registros y mostrar sus campos— es prácticamente el 80 % del trabajo en desarrollo web.
for o foreach: cuál usar
| Situación | Bucle |
|---|---|
| Recorrer un array completo | foreach |
| Necesitas la posición numérica | for |
| Repetir N veces algo que no es un array | for |
| Recorrer un array asociativo | foreach |
| Recorrer hacia atrás | for |
La regla corta: si hay un array de por medio, foreach. Para todo lo demás, for.
Modificar el array mientras lo recorres
Aquí hay una trampa clásica. Esto no funciona:
<?php
$precios = [100, 200, 300];
foreach ($precios as $precio) {
$precio = $precio * 2; // no cambia el array
}
print_r($precios); // sigue siendo 100, 200, 300
$precio es una copia, no el elemento original. Hay dos formas de resolverlo.
Con la clave:
<?php
foreach ($precios as $i => $precio) {
$precios[$i] = $precio * 2;
}
Por referencia, usando &:
<?php
foreach ($precios as &$precio) {
$precio = $precio * 2;
}
unset($precio); // importante
Ese unset() del final no es opcional. Si lo omites, $precio sigue apuntando al último elemento del array, y el siguiente foreach que use esa variable lo va a sobrescribir. Es un error muy difícil de encontrar, así que la recomendación es preferir la versión con clave salvo que tengas motivo para lo contrario.
Bucles anidados
Un bucle puede contener otro:
<?php
for ($i = 1; $i <= 3; $i++) {
for ($j = 1; $j <= 3; $j++) {
echo "$i x $j = " . ($i * $j) . "\n";
}
}
El bucle interno se ejecuta por completo en cada vuelta del externo: 3 × 3 son 9 líneas.
Ojo con esto en aplicaciones reales: si el bucle interno hace una consulta a la base de datos, estás multiplicando el número de consultas. Es la misma idea del problema N+1 que vimos en el curso de Laravel.
break y continue
Funcionan igual que en while:
<?php
$productos = ["Teclado", "Monitor", "Mouse", "Webcam"];
foreach ($productos as $producto) {
if ($producto === "Mouse") {
continue; // se lo salta
}
if ($producto === "Webcam") {
break; // sale del bucle
}
echo $producto . "\n";
}
En bucles anidados, break 2 sale de los dos niveles a la vez.
Sintaxis alternativa con HTML
La que vas a usar al pintar listas y tablas:
<ul>
<?php foreach ($productos as $producto): ?>
<li><?php echo $producto; ?></li>
<?php endforeach; ?>
</ul>
Errores comunes
- Esperar que
foreachmodifique el array. Como vimos, recibe copias. - Olvidar el
unset()tras unforeachpor referencia. - Usar
$i <= count($array)en unfor. Los índices empiezan en 0, así que el último escount() - 1y esa comparación se pasa por uno. - Llamar a
count()dentro de la condición de unforlargo: se ejecuta en cada vuelta. Guárdalo antes en una variable.
Para cerrar
foreach es el bucle del día a día en PHP, porque casi todo lo que manejas son arrays: resultados de consultas, datos de formularios, listas de opciones. for queda para cuando necesitas control sobre el número de vuelta.
En la siguiente lección veremos switch, la alternativa a las cadenas largas de elseif.
Saludos y éxitos.
Norvic Software
Desarrollamos el software que tu empresa necesita
Somos una fábrica de software en Bolivia. Construimos sistemas a medida y aplicaciones móviles, y llevamos Inteligencia Artificial a las empresas que ya tienen un sistema funcionando.
- Chatbots con Inteligencia Artificial
- Creación de agentes de IA
- Integración de IA en tus sistemas
- Desarrollo de software a medida
- Aplicaciones móviles iOS y Android
- Consultoría y asesoramiento técnico
Cotización sin costo · Respuesta directa por WhatsApp