Curso de PHP

Estructuras repetitivas for y foreach en PHP

Por Víctor Peña · Publicado el

Estructuras repetitivas for y foreach en PHP

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:

  1. $i = 1 — se ejecuta una sola vez, al empezar.
  2. $i <= 5 — se comprueba antes de cada vuelta.
  3. $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 foreach modifique el array. Como vimos, recibe copias.
  • Olvidar el unset() tras un foreach por referencia.
  • Usar $i <= count($array) en un for. Los índices empiezan en 0, así que el último es count() - 1 y esa comparación se pasa por uno.
  • Llamar a count() dentro de la condición de un for largo: 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.

Solicitar cotizaciónVer todos los servicios

Cotización sin costo · Respuesta directa por WhatsApp