«Do… while» es otra construcción de bucle disponible en PHP. Este tipo de bucle es similar al bucle while, excepto que la condición de prueba se comprueba al final de cada iteración en lugar de al principio de una nueva iteración.

El bucle while verifica la condición de verdad antes de entrar en el bucle, mientras que en «do… while», la condición de verdad se verifica antes de volver a entrar en el bucle. Como resultado, el «do… while» tiene garantizado tener al menos una iteración, independientemente de la condición de verdad.

En la siguiente figura se muestra la diferencia entre el bucle «while» y el bucle «do… while» mediante el uso de una representación de diagrama de flujo comparativa de los dos.

La sintaxis para constituir un «do… while» es similar a su contraparte en el lenguaje C.

do{
   statements;}while(expression);

Ejemplo

Aquí hay un ejemplo simple de «do… while» que imprime los números de iteración del 1 al 5.

<?php
   $i=1;
   do{
      echo "Iteration No: $i \n";
      $i++;
   }
   while ($i<=5);
?>

Producirá el siguiente resultado:

Iteration No: 1 
Iteration No: 2 
Iteration No: 3 
Iteration No: 4 
Iteration No: 5

Ejemplo

El siguiente código usa un bucle while y también genera la misma salida:

<?php
   $i=1;
   while ($i<=5){
      echo "<h3>Iteration No: $i</h3>";
      $i++;
   }         
?>

Por lo tanto, se puede decir que el «do… Los bucles while» y «while» se comportan de manera similar. Sin embargo, la diferencia será evidente cuando el valor inicial de la variable de contador (en este caso $i) se establezca en cualquier valor mayor que el utilizado en la expresión de prueba entre paréntesis delante de la palabra clave while.

Ejemplo

En el siguiente código, ambos bucles – while y «do… while» – se utilizan. La variable de contador para el bucle while es $i y para «do… while», es $j. Ambos se inicializan en 10 (cualquier valor mayor que 5).

<?php
   echo "while Loop \n";
   $i=10;
   while ($i<=5){
      echo "Iteration No: $i \n";
      $i++;
   }   

   echo "do-while Loop \n"; 
   $j=10;
   do{
      echo "Iteration No: $j \n";
      $j++;
   }
   while ($j<=5);
?>

Producirá el siguiente resultado:

while Loop
do - while Loop
Iteration No: 10

El resultado muestra que el bucle while no realiza ninguna iteración, ya que la condición es falsa al principio ($i se inicializa en 10, que es mayor que la condición de prueba $i<=5). Por otro lado, el «do… while» se somete a la primera iteración aunque la variable de contador $j se inicialice en un valor mayor que la condición de prueba.

Por lo tanto, podemos inferir que el «do… while» garantiza al menos una iteración porque la condición de prueba se verifica al final del bloque de bucle. Es posible que el bucle while no realice ninguna iteración, ya que la condición de prueba se verifica antes de ingresar al bloque de bucle.

Otra diferencia sintáctica es que la instrucción while en «do… while» termina con punto y coma. En el caso del bucle while, el paréntesis va seguido de un bloque de bucle entre corchetes.

Aparte de estos, no hay diferencias. Se pueden usar ambos tipos de bucles indistintamente.

Disminuir un «do… while» Bucle

Para diseñar un «do… while» con decrementing count, inicialice la variable de contador a un valor mayor, use el operador de decremento (–) dentro del bucle para reducir el valor del contador en cada iteración y establezca la condición de prueba en el paréntesis while para ejecutar el bucle hasta que el contador sea mayor que el último valor deseado.

Ejemplo

En el siguiente ejemplo, el contador disminuye de 5 a 1.

<?php
   $j=5;
   do{
      echo "Iteration No: $j \n";
      $j--;
   }
   while ($j>=1);
?>

Producirá el siguiente resultado:

Iteration No: 5
Iteration No: 4
Iteration No: 3
Iteration No: 2
Iteration No: 1

Recorrer una cadena en orden inverso

En PHP, una cadena puede ser tratada como una matriz indexada de caracteres. Podemos extraer y mostrar un carácter a la vez desde el final hasta el principio ejecutando un «do… while» de la siguiente manera:

<?php
   $string = "TutorialsPoint";
   $j = strlen($string);

   do{
      $j--;
      echo "Character at index $j : $string[$j] \n";
   }
   while ($j>=1);
?>

Producirá el siguiente resultado:

Character at index 13 : t
Character at index 12 : n
Character at index 11 : i
Character at index 10 : o
Character at index 9 : P
Character at index 8 : s
Character at index 7 : l
Character at index 6 : a
Character at index 5 : i
Character at index 4 : r
Character at index 3 : o
Character at index 2 : t
Character at index 1 : u
Character at index 0 : T

Anidada «do… while» Bucles

Al igual que el bucle for o el bucle while, también puede escribir anidados «do… while» bucles. En el siguiente ejemplo, la opción «do… while» cuenta la iteración con $i, el bucle interno «do… while» incrementa $j y cada vez imprime el producto de $i*j, imprimiendo así las tablas del 1 al 10.

<?php
   $i=1;
   $j=1;

   do{
      print "\n";
      do{
         $k = sprintf("%4u",$i*$j);
         print "$k";
         $j++;
      } 
      while ($j<=10);
      $j=1;
      $i++;
   }
   while ($i<=10);
?>

Producirá el siguiente resultado:

1   2   3   4   5   6   7   8   9  10
2   4   6   8  10  12  14  16  18  20
3   6   9  12  15  18  21  24  27  30
4   8  12  16  20  24  28  32  36  40
5  10  15  20  25  30  35  40  45  50
6  12  18  24  30  36  42  48  54  60
7  14  21  28  35  42  49  56  63  70
8  16  24  32  40  48  56  64  72  80
9  18  27  36  45  54  63  72  81  90
10  20  30  40  50  60  70  80  90 100