![PHP 7+MySQL 8动态网站开发从入门到精通(视频教学版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/141/36862141/b_36862141.jpg)
4.8 流程控制
流程控制也叫控制结构,在一个应用中用来定义执行程序流程。它决定了某个程序段是否会被执行和执行多少次。
PHP中的控制语句分为3类:顺序控制语句、条件控制语句和循环控制语句。其中,顺序控制语句是从上到下依次执行的,这种结构没有分支和循环,是PHP程序中最简单的结构。下面主要讲述条件控制语句和循环控制语句。
4.8.1 条件控制结构
条件控制语句中包含两个主要的语句:一个是if语句,另一个是switch语句。
1.单一条件分支结构(if语句)
if语句是最为常见的条件控制语句,格式为:
if(条件判断表达式){ 程序块; }
这种形式只是对一个条件进行判断。如果条件判断表达式成立,就执行程序块中的语句,否则不执行。
if语句的程序流程控制如图4-15所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P81_56824.jpg?sign=1739160900-U1bO1fgeuud4Oe7a5Nl2mp92NnpFnnNP-0-70b2ecf50c4cb53e6e395732c55730b4)
图4-15 if语句的流程控制图
【例4.13】(实例文件:源文件\ch04\4.13.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P81_56825.jpg?sign=1739160900-7Qzvszn0J7pr5zWP1IwPoZyOIerXlPkc-0-26a6b9d4917c0898b31de494ef584d33)
本程序的运行后刷新页面,结果如图4-16所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P82_9420.jpg?sign=1739160900-bCPg01tyPBaYow6MnIUbMgtriRoPSLII-0-73346394e97ede3d8a2ea3c89e1eefa0)
图4-16 程序的运行结果
【案例分析】
(1)此实例首先调用rand()函数随机生成一个整数$num,然后判断这个随机整数是不是奇数:若是,则输出信息;若不是,则不输出任何内容。如果页面内容显示为空,就刷新页面。
(2)rand()函数返回随机整数,语法格式如下:
rand(min,max)
此函数主要是返回min和max之间的一个随机整数。如果没有提供可选参数min和max,则rand()返回0到RAND_MAX之间的伪随机整数。
2.双向条件分支结构(if…else语句)
如果是非此即彼的条件判断,可以使用if…else语句。它的格式为:
If(条件判断表达式){ 程序块1; }else{ 程序块2; }
这种结构形式首先判断条件表达式是否为真,如果为真,就执行程序块1中的语句,否则执行程序块2中的语句。
if…else语句的程序流程控制如图4-17所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P82_9421.jpg?sign=1739160900-3uOxg1FMzVRAR5r1nFcmbBKq4FTocLZy-0-240d02661043ebe8396d98ca2f3f2888)
图4-17 if…else语句的流程控制图
【例4.14】(实例文件:源文件\ch04\4.14.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P83_56830.jpg?sign=1739160900-WlqLnqGoH4AJ93VpWR4Mll9mClleuCOV-0-6a12dadaadcfbe8fdf4a4db437f18c85)
本程序的运行结果如图4-18所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P83_9539.jpg?sign=1739160900-wk3QRHMLrNfs7z2DGZ1hksVB4cVp7mQU-0-9a65d8dcbf61fe90f589e74c3829bdb1)
图4-18 程序的运行结果
3.多向条件分支结构(elseif语句)
在条件控制结构中,有时会出现多种选择,此时可以使用elseif语句。它的语法格式为:
if(条件判断表达式){ 程序块1; }elseif(条件判表达式){ 程序块2; }… else{ 程序块3; }…
elseif语句的程序流程控制如图4-19所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P83_9540.jpg?sign=1739160900-c4SzbKLQ3wdvJDsXLrozFVT7pa9RrZSA-0-b9853b2384d24067c505e2c3ea020f05)
图4-19 elseif语句的流程控制图
【例4.15】(实例文件:源文件\ch04\4.15.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P84_56832.jpg?sign=1739160900-EQmP6VYAmQpKliKHNfk7CSEgUvSCMYBn-0-a9527cdae07a68422d3d96fc4ee42df3)
本程序的运行结果如图4-20所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P84_9695.jpg?sign=1739160900-b7zPXfWLA7ycyLBxnicwfxsXuWcJvyOK-0-113b87b838180d52163670b45892e241)
图4-20 程序的运行结果
4.多向条件分支结构(switch语句)
switch语句的结构给出不同情况下可能执行的程序块,条件满足哪个程序块,就执行哪个程序块中的语句。它的语法格式为:
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P84_56833.jpg?sign=1739160900-KXn3L0Sb5jYSlRfmco6vZJ6dTOCz3EoX-0-7891a0dcc6c249e1b71b07d5356340ad)
其中,若“条件判断表达式”的结果符合某个“结果x”,就执行其对应的“程序块x中的语句”。如果都不符合,则执行default对应的默认项的“程序块n中的语句”。
switch语句的流程控制如图4-21所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P85_9854.jpg?sign=1739160900-MP65daFR4K6DCPAty1UeLDWqDxFwlXtz-0-01e8904b0e74570e27ad9fc351f0698a)
图4-21 switch语句的流程控制图
【例4.16】(实例文件:源文件\ch04\4.16.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P85_56834.jpg?sign=1739160900-mZDOp4BSWMEPOAzTo9L1fw0EQq9GVcfn-0-0c1cacf131768c6c7eaa0c9b045f8031)
本程序的运行结果如图4-22所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P85_9855.jpg?sign=1739160900-Wqnv75A2JAptI2AXgkmAR59TpRktA9yz-0-aee8a8ee8a191e7d4ef52db63969d070)
图4-22 程序的运行结果
4.8.2 循环控制结构
循环控制语句主要包括3种,即while循环、do…while循环和for循环。while循环在循环体程序代码运行的开始检查条件判断表达式的真假;do…while循环在循环体程序代码运行的末尾检查条件判断表达式的真假,即do…while循环的循环体内的程序代码至少要运行一遍。
1.while循环语句
while循环的结构为:
while (条件判断表达式){ 程序块; }
其中,当“条件判断表达式”为true时,执行循环体内的“程序块”,然后返回条件判断表达式继续进行判断,直到表达式的值为假才能跳出循环,执行后面的语句。
while循环语句的流程控制如图4-23所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P86_9956.jpg?sign=1739160900-jvCuuoO7zWQJ7cIw0LtmMTu6lBQDsgmS-0-fb3b8936e9e52084fb83e8bcdb2d548a)
图4-23 while语句的流程控制图
【例4.17】(实例文件:源文件\ch04\4.17.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P86_56836.jpg?sign=1739160900-2jGc7mTLBUDuuv7fmYYKH1a11VKrYXFg-0-4769325f2c7c06b7a38e71b628dbd5fb)
本程序的运行结果如图4-24所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P87_10055.jpg?sign=1739160900-1lyjolqJpkk4e8cPsf4M9S1496H9h7hU-0-832d8d158dd682aa261f5e4f8afc49d8)
图4-24 程序的运行结果
本实例主要实现20以内的奇数输出。从1~20依次判断是否为奇数,如果是,则输出;如果不是,则继续下一次的循环。
2.do…while循环语句
do…while循环的结构为:
do{ 程序块; }while(条件判断表达式)
先执行do…while循环体内的“程序块”,其中的变量会随着命令的执行发生变化。当while后的“条件判断表达式”判断为false时,就终止循环。
do…while循环语句的流程控制如图4-25所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P87_10056.jpg?sign=1739160900-RA5oVQchzG9ihV3BHr90ZALA5tK5X2qX-0-562c4b11a339ff95de71851644325902)
图4-25 do…while循环语句的流程控制图
【例4.18】(实例文件:源文件\ch04\4.18.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P87_56838.jpg?sign=1739160900-2RO1jidwqxbujCW13JsYzwCNMHc8DEyJ-0-10593ec03eda4470a77f307118ebc175)
本程序的运行结果如图4-26所示。从结果可以看出,while循环语句和do…while循环语句有很大的区别。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P88_10135.jpg?sign=1739160900-yelZcib2a6aJ1zHXEAnvrmm6YIiMcZ48-0-22f981f303fcad4948618074dd79184e)
图4-26 程序的运行结果
3.for循环语句
for循环的结构为:
for(expr1;expr2;expr3) { 程序块 }
其中,expr1为循环条件的初始值,expr2为循环条件的终止值,通常使用比较表达式或逻辑表达式充当判断条件,如果符合循环条件执行完程序块之后再执行expr3表达式。
for循环语句的流程控制图如图4-27所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P88_10136.jpg?sign=1739160900-9UUUZHxL3TBT6FHMNp00bPBdgViZUp1v-0-2da65eaaa1cc9da0e6b34c61257b7f77)
图4-27 for循环语句流程控制图
【例4.19】(实例文件:源文件\ch04\4.19.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P88_56840.jpg?sign=1739160900-aQyQOe11yjHjXO8OiJN1WbvM9uRKG7o6-0-0dff540b33648b1ba46b10cf51d0e7a3)
本程序的运行结果如图4-28所示,从中可以看出循环体内的程序块执行了4次。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P89_10267.jpg?sign=1739160900-fRTdT02T8zMLj0cjy4JeIrDOGlQv8wUz-0-95cf178e2fff3d3b43b2682a9f2aed9e)
图4-28 程序的运行结果
4.foreach循环语句
foreach语句是常用的另外一种循环语句,经常被用来遍历数组元素。它的格式为:
foreach(数组 as 数组元素){ 对数组元素执行的操作; }
可以根据数组的情况分为两种,即不包含键值的数组和包含键值的数组。
不包含键值的:
foreach(数组 as 数组元素值){ 对数组元素执行的操作; }
包含键值的:
foreach(数组 as 键值 => 数组元素值){ 对数组元素执行的操作; }
每进行一次循环,当前数组元素的值就会被赋值给数组元素值变量,数组指针会逐一移动,直到数组遍历结束为止。
【例4.20】(实例文件:源文件\ch04\4.20.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P89_56844.jpg?sign=1739160900-4GyXAK4BWFD9BOGDuuhE0fXt71jEZBmt-0-16a0697fcfcc45c05dc9dbcb9d033aac)
本程序的运行结果如图4-29所示,从中可以看出循环体内的程序语句执行了3次。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P89_10268.jpg?sign=1739160900-TlwdLzNZwe0PqjxwmUF6QyEGXOFN1QKH-0-c83b2a5a73152962975c92004f550651)
图4-29 程序的运行结果
5.流程控制的另一种书写格式
在一个含有多条件、多循环的语句中,包含多个“{}”,查看起来比较烦琐。流程控制语言的另一种书写方式是以“:”来代替左边的大括号,使用“endif;”“endwhile;”“endfor;”“endforeach;”和“endswitch;”来替代右边的大括号,这种描述程序结构的可读性比较强。常见的格式如下。
条件控制语句中的if语句:
if(条件判断表达式1): 程序块1; elseif(条件判断表达式2): 程序块2; elseif(条件判断表达式3): 程序块3; … else: 程序块n; endif;
条件控制语句中的switch语句:
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P90_56846.jpg?sign=1739160900-ULuZlWLCyDpBi5wOJ5NHNVXovBbpyz27-0-dc27e10dbfcbfb1e3a28bf557b62074e)
循环控制语句中的while循环:
while(条件判断表达式): 程序块 endwhile;
循环控制语句中的do…while循环:
do 程序块 while(条件判断表达式);
循环控制语句中的for循环:
for(循环条件初始值;循环条件终止值;循环变量步长): 程序块 endfor;
【例4.21】(实例文件:源文件\ch04\4.21.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P91_56851.jpg?sign=1739160900-0mB3tLbyUb1NhlmAVyrHMwRVz9ev3B85-0-2a80b0ffa095ca7ca05b0ed5d2e22378)
本程序的运行结果如图4-30所示。从结果图中可以看出,该代码使用新的书写格式实现了杨辉三角的排列输出。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P91_10613.jpg?sign=1739160900-do5MYggMd7Hyc4Gvd22qTZF8G9dC9EwA-0-ef7aef02d6888d9c7fcb4f8fea246e59)
图4-30 程序的运行结果
6.使用break/continue语句跳出循环
使用break语句可以跳出(也就是终止)循环控制语句,也可以跳出条件控制语句中switch语句的执行,例如:
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P91_56852.jpg?sign=1739160900-jazpT0bNDzRRiDzG514aM33Mg1r0LSuv-0-a4538c92c60bff62e9f5b7bc272697c8)
在这段程序中,while循环控制语句里面包含一个switch流程控制语句。在程序执行到break语句时,break会终止执行switch语句或者while语句。其中,在“case 1”下的break语句跳出switch语句;“case 2”下的break 2语句跳出switch语句和包含switch的while语句;“default”下的break 1语句和“case 1”下的break语句一样,只是跳出switch语句。其中,break后带的数字参数是指break要跳出的控制语句结构的层数。
使用continue语句可用于结束当前一轮的循环,也就是跳过当前一轮循环体内剩下的语句,直接进入下一轮循环的执行。下面通过一个实例说明continue的作用。
【例4.22】(实例文件:源文件\ch04\4.22.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P92_56854.jpg?sign=1739160900-9bsY1I8BgPjCE9IWiGZDtTpd4JXhpiPn-0-c1d7472311d200053def8ab26ae28b76)
本程序的运行结果如图4-31所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P92_10753.jpg?sign=1739160900-Xi0bPwU2JQBuJP4zfDmQObT3z2lxDOVJ-0-de6f3128e27c32ee1b4ea668c5f7afd2)
图4-31 程序的运行结果
其中,continue关键字在当n等于2的时候结束本轮循环,并且直接进入下一轮循环,即n等于3。另外,continue关键字和break关键字一样,都可以在后面直接跟一个数字参数,用来表示跳离循环的结构层数。“continue”和“continue 1”相同,“continue 2”表示跳离所在循环和上一级循环当前轮次的循环。