do-while

do-while loops are very similar to while loops, except the truth expression is checked at the end of each iteration instead of in the beginning. The main difference from regular while loops is that the first iteration of a do-while loop is guaranteed to run (the truth expression is only checked at the end of the iteration), whereas it's may not necessarily run with a regular while loop (the truth expression is checked at the beginning of each iteration, if it evaluates to FALSE right from the beginning, the loop execution would end immediately).

There is just one syntax for do-while loops:

<?php
$i
= 0;
do {
   echo
$i;
} while (
$i > 0);
?>

The above loop would run one time exactly, since after the first iteration, when truth expression is checked, it evaluates to FALSE ($i is not bigger than 0) and the loop execution ends.

Advanced C users may be familiar with a different usage of the do-while loop, to allow stopping execution in the middle of code blocks, by encapsulating them with do-while (0), and using the break statement. The following code fragment demonstrates this:

<?php
do {
   if (
$i < 5) {
       echo
"i is not big enough";
       break;
   }
  
$i *= $factor;
   if (
$i < $minimum_limit) {
       break;
   }
   echo
"i is ok";

  
/* process i */

} while (0);
?>

Don't worry if you don't understand this right away or at all. You can code scripts and even powerful scripts without using this 'feature'.



do-while
rlynch at lynchmarks dot com
08-May-2006 02:02
I would not be as pessimistic about the potential uses of the do-while construction, myself.  It is just about the only elegant way of coding blocks that must have at least a single pass of execution, and where various assessments can short-circuit the logic, falling through. 

Consider the example of prompting a user to input a value for a variable.  The code in while() format might be:

<?php
$result
= null ;
while(
$result === null )
{
   print
"Gimme some skin, bro!> ";
  
$result = trim( fgets( $stdin ) );
   if(
$result === '' )
    
$result = null ;
}
?>

Well, that works.  Lets try it in do-while format:

<?php
$result
= '';
do {
   print
"Gimme some skin, bro!> ";
  
$result = trim( fgets( $stdin ) );
}
while(
$result === '' );
?>

See how it just "reads better"?  You say to yourself, "set up $result, print a message, get a response, and continue do to that while the nincompoop fails to enter anything."

Likewise, that "Advanced C" programming example turns out to be the elegant "no goto" way to run through exceptionally involved pieces of block-logic, with a trivial 'break' able to get one all the way past all the unnecessary code in one fell swoop.

For just about every other 'while()' block application, it shouldn't be used.  While() is what we expect, and while() is what we should use ... except when the surprisingly common "but we have to do it at <i>least once</i>" criterion pops up its pretty head.

rlynch AT lynchmarks DOT com

<whilefor>
 Last updated: Tue, 15 Nov 2005