W3docs

Comprender el bucle do-while en PHP

Aprende cómo funciona el bucle do-while en PHP, cuándo usarlo frente a while, validación de entrada y errores comunes.

Los bucles te permiten ejecutar el mismo bloque de código muchas veces sin escribirlo a mano. PHP tiene cuatro construcciones de bucle — for, while, do-while y foreach — y el bucle do-while es el que debes usar cuando el cuerpo debe ejecutarse al menos una vez, sin importar lo que diga la condición.

Esto es lo que hace diferente a do-while de un bucle while normal: un bucle while comprueba su condición antes de la primera iteración, por lo que el cuerpo puede no ejecutarse nunca. Un bucle do-while comprueba la condición después de cada iteración, por lo que el cuerpo siempre se ejecuta una vez y luego se repite mientras la condición sea verdadera.

Este capítulo cubre la sintaxis, cómo difiere do-while de while, un caso de uso real clásico (validación de entrada), cómo se comportan break y continue dentro de él, y el error común de desfase en uno.

Sintaxis

do {
    // code to be executed each iteration
} while (condition);

El cuerpo se encuentra dentro del bloque do { ... }, y la condición se evalúa después de que el cuerpo se ejecuta. Nota el punto y coma después de while (condition) — es obligatorio aquí (a diferencia de un bucle while normal) y olvidarlo es un error de sintaxis frecuente.

El flujo es: ejecutar el cuerpo una vez → evaluar la condición → si es verdadera, ejecutar el cuerpo de nuevo → repetir → detenerse la primera vez que la condición sea falsa.

Un primer ejemplo

Esto imprime los números del 1 al 10:

php— editable, runs on the server

El cuerpo se ejecuta, imprime $i, lo incrementa, y luego se comprueba la condición $i <= 10. Una vez que $i llega a 11 la condición es falsa y el bucle termina, por lo que se imprimen los dígitos del 1 al 10.

do-while vs. while: la diferencia clave

El cuerpo de un bucle do-while siempre se ejecuta al menos una vez, incluso cuando la condición es falsa desde el principio. Un bucle while, en cambio, puede ejecutarse cero veces. Compara:

<?php

// do-while: body runs once, THEN the condition is checked
$x = 100;
do {
    echo "do-while ran\n";
} while ($x < 10);

// while: condition checked first, so the body never runs
$y = 100;
while ($y < 10) {
    echo "while ran\n";
}

// Output:
// do-while ran

Aunque 100 < 10 es falso en ambos casos, el cuerpo del do-while se imprimió una vez. Usa do-while cuando "ejecuta esto, luego decide si repetir" se ajusta a tu lógica.

Uso en el mundo real: validar entrada

El comportamiento de "ejecutar al menos una vez" es perfecto para solicitar entrada a un usuario (o reintentar una operación) hasta que el resultado sea aceptable — siempre necesitas al menos un intento antes de tener algo que validar:

<?php

$attempts = 0;
$pin = "";

do {
    $attempts++;
    // In real code this would read from input; we simulate the attempts:
    $pin = ["123", "0000", "4821"][$attempts - 1];
    echo "Attempt $attempts: tried '$pin'\n";
} while ($pin !== "4821" && $attempts < 3);

echo $pin === "4821" ? "Access granted\n" : "Locked out\n";

// Output:
// Attempt 1: tried '123'
// Attempt 2: tried '0000'
// Attempt 3: tried '4821'
// Access granted

El bucle continúa hasta que se introduce el PIN correcto o se alcanza el límite de intentos — y nunca necesita un "primer intento" separado antes del bucle.

break y continue

break sale del bucle inmediatamente, y continue salta a la comprobación de la condición (la siguiente iteración):

<?php

$i = 0;
do {
    $i++;
    if ($i === 3) {
        continue; // skip printing 3
    }
    if ($i > 5) {
        break;    // stop entirely
    }
    echo $i;
} while (true);

// Output: 1245

3 es omitido por continue, y break detiene el bucle después de 5, por lo que se imprimen 1, 2, 4, 5.

Error común: la trampa del desfase en uno

Debido a que do-while se ejecuta antes de comprobar, una condición "vacía" todavía produce una iteración. Si procesas una colección que podría estar vacía, prefiere foreach o while — un do-while procesaría primero un elemento inexistente:

<?php

$items = []; // empty!
$index = 0;
do {
    echo "Processing item $index\n"; // runs once even though there are no items
    $index++;
} while ($index < count($items));

// Output: Processing item 0

Usa do-while solo cuando "al menos una vez" es genuinamente lo que deseas.

Diagrama de flujo

graph LR
A[Start] --> B[Execute code block]
B --> C[Check condition]
C --> D{Is condition true?}
D --Yes--> B
D --No--> E[End]

Capítulos relacionados

Práctica

Práctica
¿Cuál es el comportamiento y la funcionalidad del bucle 'do-while' en PHP?
¿Cuál es el comportamiento y la funcionalidad del bucle 'do-while' en PHP?
Was this page helpful?