Menu

Bucle while y do while en PHP: sintaxis y ejemplos

while (condition) { ... } repite un bloque mientras la condición sea verdadera, comprobándola antes de cada vuelta. do { ... } while (condition); la comprueba después, así que siempre se ejecuta al menos una vez. Incluye while (true) con break, leer un archivo línea a línea y cómo evitar bucles infinitos.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

while (condition) { ... } ejecuta el bloque una y otra vez mientras la condición sea verdadera. La condición se comprueba antes de cada vuelta, así que si es falsa desde el principio, el cuerpo no se ejecuta nunca. Algo dentro del bucle tiene que cambiar la condición, o nunca termina.

Este es el tipo de pregunta para el que existe while: no sabes de antemano el número de vueltas, solo cuándo parar. Cambia el tipo de interés y vuelve a ejecutarlo.

do while: ejecutar al menos una vez

do { ... } while (condition); comprueba la condición después del cuerpo, así que el cuerpo siempre se ejecuta una vez. Fíjate en el punto y coma del final.

Un uso típico es "intentar y luego comprobar": tirar un dado hasta sacar un seis, generar un código hasta que no esté en uso. El primer intento tiene que ocurrir antes de que haya algo que comprobar. Este da un resultado distinto en cada ejecución:

while (true) con break

Cuando la condición de salida es más fácil de comprobar en mitad del cuerpo, escribe while (true) y sal con break. continue salta a la siguiente comprobación, como en cualquier bucle.

array_shift() devuelve null cuando el array está vacío, que es la otra forma de salir. El mismo bucle se podría escribir como while ($queue), porque un array vacío cuenta como falso.

Leer un archivo línea a línea

fgets() devuelve una línea cada vez y false al final del archivo, así que dirige directamente un bucle while. El bloque escribe primero el archivo y luego lo vuelve a leer.

Los paréntesis alrededor de $line = fgets($handle) importan: primero se hace la asignación y luego se compara el resultado con false. Usar !== false en lugar de una simple comprobación de verdad evita que una última línea que contenga solo 0 (sin salto de línea detrás) termine el bucle antes de tiempo. La página de fopen() explica las funciones de archivos.

while con endwhile en plantillas

Igual que if y for, while tiene una forma con dos puntos para HTML: while (...): y endwhile;. Esta imprime una lista de cuenta atrás en la pestaña Página.

Error frecuente: el bucle que nunca termina

El contador tiene que avanzar hacia la salida. Olvida $i++, o cambia la variable equivocada, y la condición sigue siendo verdadera para siempre. En un servidor web, PHP detiene el script tras max_execution_time (30 segundos por defecto) con un error fatal. En la línea de comandos no se detiene nunca.

// Never ends: $i is never changed
$i = 0;
while ($i < 3) {
    echo $i;
}

Un límite de seguridad es una protección barata para los bucles que dependen de datos externos, como reintentar una llamada o recorrer resultados página a página:

Ejecútalo varias veces: unas veces funciona pronto, otras se rinde, pero siempre termina. Cuando conoces de antemano el número de vueltas, un bucle for indica el inicio, el final y el paso en una línea y es más difícil equivocarse.

Preguntas frecuentes

¿Cuál es la diferencia entre while y do while en PHP?

while comprueba la condición antes de cada vuelta, así que puede que el cuerpo no se ejecute nunca. do { ... } while ($cond); la comprueba después de cada vuelta, así que el cuerpo siempre se ejecuta al menos una vez. Fíjate en el punto y coma tras la condición del do while.

¿Cómo detengo un bucle while infinito en PHP?

Dentro del bucle, termínalo con break cuando se cumpla tu condición de salida: while (true) { ...; if ($done) { break; } }. Si el bucle no tiene break y su condición nunca se vuelve falsa, el script se ejecuta hasta que lo detiene el max_execution_time de PHP (peticiones web) o para siempre (línea de comandos).

¿Cuándo uso while en lugar de for en PHP?

Usa while cuando no sabes cuántas vueltas necesitas: leer hasta que termine un archivo, reintentar hasta que algo funcione, procesar una cola hasta vaciarla. Usa for cuando cuentas, y foreach para visitar cada elemento de un array.

¿PHP tiene un bucle do until?

No. Niega la condición de parada en un do while: do { $n++; } while (!($n >= 3)); se ejecuta hasta que $n >= 3 es verdadero. until no es una palabra clave de PHP.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR