php-bucles-en-php-while-for-y-foreach

Bucles en PHP: while, for y foreach

  • 4 min

Un bucle es una estructura que repite un bloque de código mientras se cumpla una condición o queden elementos por recorrer.

Imagina que tienes una tienda online con 5.000 productos y quieres bajar el precio de todos un 10%. No vas a escribir 5.000 líneas de código una por una.

Para eso existen los bucles (o estructuras iterativas): definimos una lógica una vez y la aplicamos a un conjunto de datos tantas veces como sea necesario.

En PHP tenemos tres herramientas principales. Vamos a ver cuándo usar cada una.

while: “mientras esto sea verdad…”

Es el bucle más primario. Ejecuta el código mientras la condición sea true.

$contador = 1;

while ($contador <= 5) {
    echo "Vuelta número $contador \n";
    $contador++; // Avanzamos el contador
}
Copied!

El peligro: el bucle infinito

Si te olvidas de poner $contador++, la condición $contador <= 5 siempre será verdadera. Tu script nunca terminará, tu servidor se quedará “colgado” consumiendo CPU y tendrás que matarlo. Ten mucho cuidado con las condiciones de salida.

¿Cuándo usar while? Cuando no sabes cuántas veces tienes que repetir algo de antemano.

  • Ejemplo: “Lee líneas de este archivo hasta llegar al final”.
  • Ejemplo: “Intenta una operación un número limitado de veces mientras siga fallando”.

for: el contador de precisión

Es la navaja suiza clásica. Condensa la lógica del while en una sola línea.

Estructura: for (inicio; condición; actualización)

for ($i = 0; $i < 10; $i++) {
    echo "El cuadrado de $i es " . ($i ** 2) . "\n";
}
Copied!

¿Cuándo usar for? Cuando sabes exactamente cuántas veces quieres iterar o necesitas un contador numérico. Es ideal para matemáticas, secuencias o generar tablas HTML.

foreach: el rey de los arrays (y de PHP)

Aquí es donde PHP brilla. Mientras que en C o Java antiguo tenías que usar for para recorrer listas, en PHP usamos foreach. Es más limpio, más seguro y más fácil de leer.

foreach toma un conjunto de datos (un array o un objeto) y lo recorre elemento a elemento. No necesitas contadores.

Opción a: solo el valor

$frutas = ['Manzana', 'Pera', 'Plátano'];

foreach ($frutas as $fruta) {
    echo "Tengo una $fruta \n";
}
Copied!

Opción b: clave y valor

A veces necesitas saber el índice o la clave del array (ej: el ID de un usuario).

$usuario = [
    'nombre' => 'Luis',
    'rol'    => 'Admin',
    'web'    => 'luisllamas.es'
];

foreach ($usuario as $clave => $valor) {
    echo "$clave: $valor \n";
}
// Salida:
// nombre: Luis
// rol: Admin...
Copied!

¿Cuándo usar foreach? Usa foreach siempre que trabajes con arrays o colecciones de datos. Evita el error de salirse del rango, algo muy común con el for.

Profundidad técnica: modificar datos dentro del bucle

Por defecto, foreach trabaja con una copia del valor. Si cambias el valor dentro del bucle, el array original no cambia.

$precios = [10, 20, 30];

foreach ($precios as $precio) {
    $precio = $precio * 2; // Solo modificamos la variable temporal
}

// $precios sigue siendo [10, 20, 30]
Copied!

Si quieres modificar el array original, necesitas usar referencias anteponiendo &:

foreach ($precios as &$precio) { // Ojo al &
    $precio = $precio * 2;
}
// Ahora $precios es [20, 40, 60]

unset($precio); // ¡IMPORTANTE! Romper la referencia
Copied!

Cuando uses & (referencias), al terminar el bucle la variable $precio sigue “enganchada” al último elemento del array. Si la usas después por error, modificarás el array sin querer. Haz unset($variable) al terminar un bucle por referencia.

break y continue: controlando el tráfico

A veces no quieres terminar todo el bucle.

  • break: “Para el carro”. Rompe el bucle completamente y sale.
  • continue: “Salta esta vuelta”. Deja de ejecutar la iteración actual y pasa a la siguiente.
$buscador = 'Pera';
$cesta = ['Manzana', 'Podrida', 'Pera', 'Uva'];

foreach ($cesta as $fruta) {
    if ($fruta === 'Podrida') {
        continue; // ¡Puaj! Saltamos esta y seguimos
    }

    if ($fruta === $buscador) {
        echo "¡Encontrada!";
        break; // Ya la tengo, dejo de buscar
    }
}
Copied!