El while repite mientras una condición sea verdadera. Se usa cuando no sabes de antemano cuántas vueltas habrá: hasta juntar cierto monto, hasta encontrar un dato, hasta que se acaben las filas que devolvió la base de datos.

while

El recorrido de un while

flowchart TD
    A["Antes del ciclo<br/>preparar la variable"] --> B{"¿Condición?"}
    B -->|sí| C["Cuerpo<br/>(debe acercarse al final)"]
    C --> B
    B -->|no| D["Sigue el programa"]
<?php
$ahorro = 0;
$semana = 0;
 
while ($ahorro < 50000) {
    $semana++;
    $ahorro += 12000;
    echo "Semana $semana: $ahorro\n";
}
 
echo "Meta lograda en $semana semanas\n";
Semana 1: 12000
Semana 2: 24000
Semana 3: 36000
Semana 4: 48000
Semana 5: 60000
Meta lograda en 5 semanas

El mismo conteo del 1 al 5 que hacía el for, escrito con while, muestra que el for es solo un while con las tres partes juntas:

<?php
$i = 1;              // inicio
while ($i <= 5) {    // condición
    echo $i . " ";
    $i++;            // avance
}
echo "\n";
1 2 3 4 5 
UsaCuando
forSabes cuántas vueltas hay: del 1 al 10, de 1960 a hoy
whileRepites hasta que algo pase: llegar a una meta, encontrar un dato
foreachRecorres un arreglo elemento por elemento (en la Parte 5)

El ciclo infinito

Si la condición nunca se vuelve falsa, el ciclo no termina.

Incorrecto: olvidar el avance

<?php
$i = 1;
while ($i <= 5) {
    echo $i;
}

$i vale siempre 1: la condición es siempre verdadera. En la terminal se llena la pantalla de unos; en el navegador, la página queda cargando sin terminar.

Correcto: algo dentro del cuerpo acerca la condición al final

Antes de ejecutar un while, pregúntate: ¿qué línea del cuerpo cambia la variable de la condición? Si no hay ninguna, es infinito.

Cómo detenerlo

Dónde correQué hacer
php archivo.php en la terminalCtrl + C
En el navegador, con php -SCtrl + C en la terminal del servidor, y vuelve a levantarlo

PHP se detiene solo a los 30 segundos… en el navegador

Cuando se ejecuta desde el servidor, PHP corta cualquier página que tarde más de 30 segundos, con Fatal error: Maximum execution time of 30 seconds exceeded. En la terminal ese límite no existe: ahí se detiene con Ctrl + C.

Mientras tanto, php -S atiende una solicitud a la vez: si una página quedó pegada en un ciclo infinito, las demás páginas del sitio tampoco cargan.

do while

Igual que while, pero revisa la condición al final: el cuerpo se ejecuta al menos una vez.

<?php
$intentos = 0;
 
do {
    $intentos++;
    $dado = random_int(1, 6);
    echo "Intento $intentos: salió $dado\n";
} while ($dado !== 6);
 
echo "Salió un 6 en $intentos intentos\n";
Intento 1: salió 3
Intento 2: salió 1
Intento 3: salió 6
Salió un 6 en 3 intentos

(La salida cambia cada vez: es al azar.) Aquí do while calza, porque hay que tirar el dado antes de poder preguntar si salió 6. Es el ciclo menos usado de los tres.

continue: saltar a la siguiente vuelta

continue termina la vuelta actual y pasa a la siguiente, sin ejecutar lo que queda del cuerpo.

<?php
for ($i = 1; $i <= 10; $i++) {
    if ($i % 3 === 0) {
        continue;
    }
    echo $i . " ";
}
echo "\n";
1 2 4 5 7 8 10 

Los múltiplos de 3 se saltan.

break: salir del ciclo

break termina el ciclo completo, aunque la condición siga siendo verdadera.

<?php
for ($n = 1; $n <= 100; $n++) {
    if ($n % 5 === 0 && $n % 7 === 0) {
        echo "El primer múltiplo de 5 y de 7 es $n\n";
        break;
    }
}
El primer múltiplo de 5 y de 7 es 35

Después de encontrar el primero no tiene sentido revisar los 65 números que quedan.

continue frente a break

 vuelta 1 -> vuelta 2 -> [continue] ~> vuelta 4 -> vuelta 5    salta UNA vuelta
 vuelta 1 -> vuelta 2 -> [break]    ~> fuera del ciclo         corta TODO el ciclo

Pruébalo

  • Calcula cuántas semanas necesitas para juntar $100.000 ahorrando $15.000 por semana, con while
  • Reescribe un for del 1 al 10 como while
  • Imprime del 1 al 20 saltando los múltiplos de 5 con continue
  • Error provocado: escribe un while sin avance, ejecútalo en la terminal y detenlo con Ctrl + C
  • Error provocado: el mismo ciclo en una página con php -S; mira cómo queda cargando y detén el servidor

Errores comunes

SíntomaCausaSolución
La terminal se llena sin pararCiclo infinito: la condición nunca cambiaCtrl + C; agrega el avance dentro del cuerpo
La página queda cargando y luego Maximum execution time of 30 seconds exceededCiclo infinito en una páginaDetén el servidor, corrige el avance y vuelve a levantarlo
continue no hace nadaEstá al final del cuerpo, donde ya no hay nada que saltarPonlo antes de lo que quieres omitir
El ciclo termina antes de lo esperadoUn break dentro de un if mal planteadoRevisa la condición que lleva al break

Checkpoint

Intenta responder antes de desplegar cada pregunta.