do...while 循环是 PHP 中可用的另一种循环结构。这种类型的循环类似于 while 循环,不同之处在于在每次迭代结束时检查测试条件,而不是在新迭代开始时检查。
while 循环在进入循环之前验证 True 值条件,而在 do...while 循环时,在进入循环之前验证 True 条件。因此,do...while 循环保证至少有一次迭代,而不管 True 值条件如何。
下图显示了 while 循环和 do...while 循环。

构成 do...while 循环类似于 C 语言中的对应项。
do {
声明;
}
while (expression);
例
下面是一个 “do...while“ 循环,该循环打印迭代编号 1 到 5。
<?php
$i=1;
do{
echo "第 $i 次迭代。\n";
$i++;
}
while ($i<=5);
?>
它将产生以下输出 -
第 2 次迭代。
第 3 次迭代。
第 4 次迭代。
第 5 次迭代。
示例
以下代码使用 while 循环,并且还生成相同的输出 -
<?php
$i=1;
while ($i<=5){
echo "<h3>第 $i 次迭代。</h3>";
$i++;
}
?>
因此,可以说 do...while 和 while 循环的行为类似。但是,当 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);
?>
它将产生以下输出 -
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);
?>
它将产生以下输出 -
第 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);
?>
它将产生以下输出 -
索引 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);
?>
它将产生以下输出 -
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