
4.6 循环控制结构
循环控制语句主要包括三种,即while循环、do…while循环和for循环。while循环在代码运行的开始检查表述的真假;而do…while循环则在代码运行的末尾检查表述的真假,这样,do…while循环至少要运行一遍。
4.6.1 while循环语句
while循环的结构为:
while(条件判断语句){ 命令执行语句; }
其中当“条件判断语句”为true时,执行后面的“命令执行语句”,然后返回到条件表达式继续进行判断,直到表达式的值为假,才能跳出循环,执行后面的语句。
while循环语句的流程控制图如图4-17所示。

图4-17 while语句控制流程图
【例4.13】(实例文件:ch04\4.13.php)
<? php $num = 1; //定义变量$num $str = "20以内的奇数为:"; //定义变量$x while($num <=20){ //判断$num是否小于或等于20 if($num % 2! = 0){ //判断$num是否为奇数,为奇数则输出,否则做加一操作 $str .= $num." "; } $num++; } echo $str; ?>
运行后结果如图4-18所示。

图4-18 程序运行结果
本实例主要实现20以内的奇数输出。从1~20依次判断是否为奇数,如果是,则输出;如果不是,则继续下一次的循环。
4.6.2 do…while循环语句
do…while循环的结构为:
do{ 命令执行语句; }while(条件判断语句)
其中先执行do后面的“命令执行语句”,其中的变量会随着命令的执行发生变化。当此变量通过while后的“条件判断语句”判断为false时,停止执行“命令执行语句”。
do…while循环语句的流程控制图如图4-19所示。

图4-19 do…while循环语句控制流程图
【例4.14】(实例文件:ch04\4.14.php)
<? php $aa = 0; //声明一个整数变量$aa while($aa ! = 0){ //使用while循环输出 echo "不会被执行的内容"; //这句话不会被输出 } do{ //使用do…while循环输出 echo "被执行的内容"; //这句话会被输出 }while($aa ! = 0); ?>
运行后结果如图4-20所示。从结果可以看出,while语句和do…while语句有很大的区别。

图4-20 程序运行结果
4.6.3 for循环语句
for循环的结构为:
for(expr1; expr2; expr3) { 执行命令语句 }
其中expr1为条件的初始值,expr2为判断的最终值,通常都使用比较表达式或逻辑表达式充当判断的条件,执行完命令语句后,再执行expr3。
for循环语句的流程控制图如图4-21所示。

图4-21 for循环语句控制流程图
【例4.15】(实例文件:ch04\4.15.php)
<? php for($i=0; $i<4; $i++){ //使用for循环输出 echo "for语句的功能非常强大<br/>"; } ?>
运行结果如图4-22所示。从图中可以看出,命令语句执行了4次。

图4-22 程序运行结果
4.6.4 foreach循环语句
foreach语句是常用的一种循环语句,它经常被用来遍历数组元素。它的格式为:
foreach(数组as数组元素){ 对数组元素的操作命令; }
可以根据数组的情况分为两种,即不包含键值的数组和包含键值的数组。
不包含键值的:
foreach(数组as数组元素值){ 对数组元素的操作命令; }
包含键值的:
foreach(数组as键值 => 数组元素值){ 对数组元素的操作命令; }
每进行一次循环,当前数组元素的值就会被赋值给数组元素值变量,数组指针会逐一地移动,直到遍历结束为止。
【例4.16】(实例文件:ch04\4.16.php)
<? php $arr=array("one", "two", "three"); foreach ($arr as $value) //使用foreach循环输出 { echo "数组值: " . $value . "<br />"; } ?>
运行结果如图4-23所示。从图中可以看出,命令语句执行了3次。

图4-23 程序运行结果
4.6.5 流程控制的另一种书写格式
在一个含有多条件、多循环的语句中,包含多个“{}”,查看起来比较烦琐。流程控制语言的另外一种书写方式是以“:”来代替左边的大括号,使用endif; 、endwhile、endfor、endforeach;和endswitch;来替代右边的大括号,这种描述程序结构的可读性比较强。常见的格式如下。
条件控制语句中的if语句:
if(条件判断语句): 命令执行语句; elseif(条件判断语句): 命令执行语句; elseif(条件判断语句): 命令执行语句; … else: 命令执行语句; endif;
条件控制语句中的switch语句:
switch(条件判断语句): case 可能结果a: 命令执行语句; case 可能结果b: 命令执行语句; … default: 命令执行语句; endswitch;
循环控制语句中的while循环:
while(条件判断语句): 命令执行语句 endwhile;
循环控制语句中的do…while循环:
do 命令执行语句 while(条件判断语句);
循环控制语句中的for循环:
for(起始表述;为真的布尔表述;增幅表述): 命令执行语句 endfor;
【例4.17】(实例文件:ch04\4.17.php)
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>杨辉三角</title> </head> <body> <? php $mixnum = 1; $maxnum = 10; $tmparr[][] = array(); $tmparr[0][0] = 1; for($i = 1; $i < $maxnum; $i++): for($j = 0; $j <= $i; $j++): if($j == 0 or $j == $i): $tmparr[$i][$j] = 1; else: $tmparr[$i][$j] = $tmparr[$i -1][$j -1] + $tmparr[$i -1][$j]; endif; endfor; endfor; foreach($tmparr as $value): foreach($value as $vl) echo $vl.' '; echo '<p>'; endforeach; ?> </body> </html>
运行结果如图4-24所示。从效果图可以看出,该代码使用新的书写格式实现了杨辉三角的排列输出。

图4-24 程序运行结果
4.6.6 使用break/continue语句跳出循环
使用break关键字,用来跳出(也就是终止)循环控制语句和条件控制语句中的switch语句的执行。例如:
<? php $n = 0; while (++$n) { switch ($n) { case 1: echo "case one"; break ; case 2: echo "case two"; break 2; default: echo "case three"; break 1; } } ?>
在这段程序中,while循环控制语句里面包含一个switch流程控制语句。在程序执行到break语句时,break会终止执行switch语句,或者是switch和while语句。其中在 “case 1”下的break语句跳出switch语句。“case 2”下的break 2语句跳出switch语句和包含switch的while语句。“case 3”下的break 1语句和“case 1”下的break语句一样,只是跳出switch语句。其中,break后带的数字参数是指break要跳出的控制语句结构的层数。
使用continue关键字的作用是,跳开当前的循环迭代项,直接进入到下一个循环迭代项,继续执行程序。下面通过一个实例说明此关键字作用。
【例4.18】(实例文件:ch04\4.18.php)
<? php $n = 0; while ($n++ < 6) { //使用while循环输出 if ($n == 2){ continue; } echo $n."<br />"; } ?>
运行结果如图4-25所示。

图4-25 程序运行结果
其中continue关键字,在当n等于2的时候,跳出本次循环,并且直接进入到下一个循环迭代项,即当n等于3。另外,continue关键字和break关键字一样,都可以在后面直接跟一个数字参数,用来表示跳开循环的结构层数。“continue”和“continue 1”相同,“continue 2”表示跳开所在循环和上一级循环的当前迭代项。