PHP - do...While 循环



do...while 循环是 PHP 中可用的另一种循环结构。这种类型的循环类似于 while 循环,不同之处在于在每次迭代结束时检查测试条件,而不是在新迭代开始时检查。

while 循环在进入循环之前验证 True 值条件,而在 do...while 循环时,在进入循环之前验证 True 条件。因此,do...while 循环保证至少有一次迭代,而不管 True 值条件如何。

下图显示了 while 循环和 do...while 循环。

PHP Do While 循环

构成 do...while 循环类似于 C 语言中的对应项。


do {
   声明;
}
while (expression);

下面是一个 “do...while“ 循环,该循环打印迭代编号 1 到 5。


<?php
   $i=1;
   do{
      echo "第 $i 次迭代。\n";
      $i++;
   }
   while ($i<=5);
?>

它将产生以下输出 -

第 1 次迭代。
第 2 次迭代。
第 3 次迭代。
第 4 次迭代。
第 5 次迭代。

示例

以下代码使用 while 循环,并且还生成相同的输出 -


<?php
   $i=1;
   while ($i<=5){
      echo "<h3>第 $i 次迭代。</h3>";
      $i++;
   }         
?>

因此,可以说 do...whilewhile 循环的行为类似。但是,当 counter 变量的初始值(在本例中为 $i)设置为大于 while 关键字前面括号中的测试表达式中使用的值时,差异将很明显。

示例

在下面的代码中,while 循环和 do...while 循环一起使用。while 循环的 counter 变量是 $i 和 do...while 循环,则为 $j。两者都初始化为 10 (大于 5 的任何值)。


<?php
   echo "while Loop \n";
   $i=10;
   while ($i<=5){
      echo "第 $i 次迭代。\n";
      $i++;
   }   

   echo "do-while Loop \n"; 
   $j=10;
   do{
      echo "第 $j 次迭代\n";
      $j++;
   }
   while ($j<=5);
?>

它将产生以下输出 -

while Loop 
do-while Loop 
第 10 次迭代

结果显示 while 循环不执行任何迭代,因为条件本身开始时为 false($i 初始化为 10,大于测试条件 $i<=5)。另一方面,do...while 循环会进行第一次迭代,即使 counter 变量 $j 初始化为大于测试条件的值。

因此,我们可以推断出 do...while 循环保证至少一次迭代,因为测试条件在循环块的末尾得到验证。while 循环可能不会进行任何迭代,因为在进入循环块之前会验证测试条件。

另一个语法差异是 do...while 以分号结尾。在 while 循环的情况下,括号后跟一个大括号的循环块。

除此之外,没有区别。可以互换使用这两种类型的循环。

do...while 递减循环

要设计一个 do...while,将 counter 变量初始化为更高的值,在循环内使用递减运算符 (--) 来减少每次迭代的 counter 的值,并在 while 括号中设置测试条件以运行循环,直到 counter 大于所需的最后一个值。

示例

在下面的示例中,counter 从 5 递减到 1。


<?php
   $j=5;
   do{
      echo "第 $j 次迭代。\n";
      $j--;
   }
   while ($j>=1);
?>

它将产生以下输出 -

第 5 次迭代。
第 4 次迭代。
第 3 次迭代。
第 2 次迭代。
第 1 次迭代。

以相反顺序遍历字符串

在 PHP 中,字符串可以被视为字符的索引数组。我们可以通过运行递减的 do...while 循环,如下所示 -


<?php
   $string = "www.qikepu.com";
   $j = strlen($string);

   do{
      $j--;
      echo "索引 $j 处的字符: $string[$j] \n";
   }
   while ($j>=1);
?>

它将产生以下输出 -

索引 13 处的字符: m 
索引 12 处的字符: o 
索引 11 处的字符: c 
索引 10 处的字符: . 
索引 9 处的字符: u 
索引 8 处的字符: p 
索引 7 处的字符: e 
索引 6 处的字符: k 
索引 5 处的字符: i 
索引 4 处的字符: q 
索引 3 处的字符: . 
索引 2 处的字符: w 
索引 1 处的字符: w 
索引 0 处的字符: w 

do...while 嵌套循环

与 for 循环或 while 循环一样,您也可以编写嵌套的 do...while 循环。在以下示例中,上部的 do...while 循环计算迭代 $i,内部的 do...while 循环递增 $j 并且每次打印 $i*j 的乘积,从而打印从 1 到 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);
?>

它将产生以下输出 -

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