![PHP从入门到精通(微视频精编版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/433/34752433/b_34752433.jpg)
第3章 流程控制语句
(视频讲解:51分钟)
学习了PHP基础后,相信读者对PHP语言的基本运算有了一些了解,那么现在试着计算下面几个问题:输出10以内的偶数、计算100的阶乘、列举1000以内的所有素数。本章就来学习使用PHP语言中的流程控制语句解决上述问题。PHP的流程控制语句有两种:条件控制语句和循环控制语句。合理使用这些控制结构可以使程序流程清晰、可读性强,从而提高程序开发效率。
学习摘要:
if语句
switch语句
for循环语句
while循环语句
do…while循环语句
跳转语句
3.1 条件控制语句
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P58_1.jpg?sign=1739519579-bhAUL2tRVLlUTtClGkRDKaD7UXmiCyEp-0-700b560dd1146fa8bfdf9a2fb652cdd0)
视频讲解
在生活中,我们总是要做出许多决策,程序也是一样。下面给出几个常见的例子:
如果购买成功,用户余额减少,用户积分增多。
如果输入的用户名和密码正确,提示登录成功,进入网站,否则,提示登录失败。
如果用户使用微信登录,则使用微信扫一扫;如果使用QQ登录,则输入QQ号和密码;如果使用微博登录,则输入微博号和密码;如果使用手机号登录,则输入手机号和密码。
以上例子中的判断,就是程序中的条件控制语句。按照条件选择执行不同的代码片段。条件控制语句主要有if、if…else、if…elseif…else和switch 4种。下面分别进行讲解。
3.1.1 if语句
PHP的if语句的格式如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P58_2.jpg?sign=1739519579-G6tBtoj9hEECqe6TYmaMxvOfcZrF18yJ-0-caf0eb89edd897490b9276b56e29a126)
如果表达式的值为真,那么就顺序执行语句;否则,就会跳过该条语句,再往下执行。如果需要执行的语句不止一条,那么可以使用“{}”,在“{}”中的语句被称为语句组,其格式如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P58_3.jpg?sign=1739519579-IvnwD7LrqTiipBp6VHPvBubJEmLmLRrp-0-d8c63094d2ddc1168f9ea964b19b16af)
if语句的流程就像一辆运行的火车,从A站出发,可以直接到达C站,也可以经过B站,然后再到达C站,如图3.1所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P58_4.jpg?sign=1739519579-d50XhXrTXzOLakpZJNuw1OGoVXQ9BLbb-0-ea8c9b67b8678598979fefd047382a90)
图3.1 if语句流程控制图
【例3.01】 使用rand()函数生成一个随机数$num,然后判断这个随机数是不是偶数,如果是,则输出结果。代码如下:(实例位置:资源包\源码\03\3.01)
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P59_1.jpg?sign=1739519579-3HKJ6BxEJ2ZnIrbbdJs3DpzaGMuxFcjH-0-1ef3fe9de4ed22fb896500c4f2549c0d)
运行结果如图3.2所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P59_2.jpg?sign=1739519579-QQRnUGNKcvFG7mKpJnUb93KOtrb9OD61-0-017b8cb79f65f17b6c12572202921f74)
图3.2 判断随机数是否为偶数
说明
rand()函数的作用是取得一个随机的整数,每次刷新页面后,会生成一个新的随机数,可能与图3.2所示不同。
3.1.2 if…else语句
大多时候,总是需要在满足某个条件时执行一条语句,而在不满足该条件时执行其他语句。这时可以使用if…else语句,该语法格式如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P59_3.jpg?sign=1739519579-68zL6c7q5KOj4tigU5GOPxng64LQGur3-0-bcad3c0e158b17e56d0d0d0e181753cc)
该语句的含义为:当表达式的值为真时,执行语句1;如果表达式的值为假,则执行语句2。就像一辆运行的火车,只有两条轨道可以选择,如图3.3所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P59_4.jpg?sign=1739519579-37qvsmd5Z3R4apHGMoVpR65jTDQnIdI0-0-d1499829fbc931b781b066a7a59a5314)
图3.3 if…else语句流程控制图
3.1.3 elseif语句
if…else语句只能选择两种结果:要么执行语句1,要么执行语句2。但有时会出现两种以上的选择,例如,一个班的考试成绩,如果是90分以上,则为“优秀”;如果是60~90分的,则为“良好”;如果低于60分,则为“不及格”。这时可以使用elseif语句来执行,语法格式如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P60_1.jpg?sign=1739519579-4m2dNaGiPhDXkhZGwNdT8JQgx6ORGwhZ-0-5dd8699601ae9f13b20b04b3d4f0f236)
elseif语句的流程就像一辆运行的火车,从A站出发到达B站,有多条线路可以选择,根据铁路局的不同指示,选择相应的路线,如图3.4所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P60_2.jpg?sign=1739519579-FQIFHWKQyJVC2bKLFJwU2GvjUn3Guq9S-0-3453d24186b63a95f32e6fdd5a607479)
图3.4 elseif语句的流程控制图
【例3.02】 通过elseif语句,判断今天是这个月的上、中或下旬。代码如下:(实例位置:资源包\源码\03\3.02)
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P60_3.jpg?sign=1739519579-kYxODyEyQRrQF6WCmT2GSoQwnpwSrFU4-0-a321830fc09aae1d178ea42f69ac7211)
运行结果如图3.5所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P61_1.jpg?sign=1739519579-gvV6mffOfXNiu6oMmLqLU0pIH4d2qGmf-0-f296168fd93a610b2156594bc8a24187)
图3.5 判断是上、中或下旬
3.1.4 switch语句
虽然elseif语句可以进行多种选择,但如果条件较多时,就会变得十分烦琐。为了避免if语句过于冗长,提高程序的可读性,可以使用switch分支控制语句。switch语句的语法格式如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P61_2.jpg?sign=1739519579-PTkVPdIegtVrot1YFAKTBTFpbU4ySjAA-0-471777568b21443d46204077e6097f7d)
switch语句根据变量或表达式的值,依次与case中常量表达式的值相比较,如果不相等,继续查找下一个case;如果相等,就执行对应的语句,直到switch语句结束或遇到break为止。一般来说,switch语句最终都有一个默认值default,如果在前面的case中没有找到相符的条件,则输出默认语句,和else语句类似。
【例3.03】 明日学院网站支持第三方登录,第三方登录包括QQ登录、微信登录、微博登录等。根据不同的登录方式,需要调用相应的第三方接口,这时,可以根据网址中传递的值不同,使用switch语句判断用户选择了哪一个第三方应用,然后调用该应用的接口。代码如下:(实例位置:资源包\源码\03\3.03)
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P61_3.jpg?sign=1739519579-j8eRodu50cT6GF8LWGoGXHsq7wEo2ght-0-ab4f24bf9110adc495ab6f6065535a2c)
运行结果如图3.6所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P62_2.jpg?sign=1739519579-dvVYy73dizFVeF608fJCMhZZz4mYilhu-0-0fe047fd98ae90c75d56133c34eab5c8)
图3.6 switch多重判断语句
注意
switch语句在执行时,即使遇到符合要求的case语句段,也会继续往下执行,直到switch语句结束。为了避免这种浪费时间和资源的行为,一定要在每个case语句段后加上break语句。这里break语句的意思是跳出当前循环,在3.3.1节中将详细介绍break语句。
3.2 循环控制语句
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P62_3.jpg?sign=1739519579-8ibsqwdJY4DagBCWHYzIEKoHA3Q5UHaF-0-851d06b5b520b501a468a3eb987ac603)
视频讲解
对于大多数人来说,反复地做同样的事情会让人厌烦,但是对计算机而言,它们却非常擅长去完成重复的任务。计算机程序通常会周而复始地重复同样的步骤,这称为循环。循环主要有两种类型:
重复一定次数的循环,称为计数循环,如for循环。
重复直至发生某种情况时结束的循环,称为条件循环(conditional loop),因为只要条件为真,这种循环会一直持续下去,如while循环和do…while循环。
3.2.1 for循环语句
for循环是PHP的计数循环结构,它的语法格式如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P63_1.jpg?sign=1739519579-LayQjxbG19QDrhByXyWpKKzGjnxHmAFI-0-428ab0b67c3a1822a9cca7ff9adc8d6a)
其中,初始化表达式在第一次循环时无条件取一次值;条件表达式在每次循环开始前求值,如果值为真,则执行循环体里面的语句,否则跳出循环,继续往下执行;迭代表达式在每次循环后被执行。for循环语句的流程控制图如图3.7所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P63_2.jpg?sign=1739519579-NJQBfOBUixienlzWBkBm4RjMhNs4wVqs-0-f0276abc1040b3ffaccfddfb453eadd6)
图3.7 for循环语句的流程控制图
我们以现实生活中的例子来理解for循环的执行流程。在体育课上,体育老师要求同学们沿着环形操场跑步3圈。老师从0开始计数,每次跑完1圈,将数量加1。当完成第3圈时,同学会停下来,即循环结束。
【例3.04】 通过for循环来计算100的阶乘,即1×2×3×4×…×100。代码如下:(实例位置:资源包\源码\03\3.04)
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P63_3.jpg?sign=1739519579-C9zOYvowIpDitkQcJffADhZW6y7H8YeE-0-5ffeba6b6c5ecaabc634ca81ea22da3f)
上述代码中,第一步,执行for循环的初始表达式,即为$i赋值为1。第二步,判断条件表达式,即$i是否小于或等于100,如果判断的结果为真,则执行下面的程序块,将$sum乘以当前的$i;否则跳出循环,不再继续执行。第三步,执行迭代表达式,即将$i加1。此时,第一次循环结束,$i的值为2。然后判断$i是否小于或等于100,重复第一次的操作。当$i为100时,执行第100次程序块代码。然后$i继续迭代,值为101。此时,判断表达式的结果为假,循环结束,不再执行。运行结果如图3.8所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P64_1.jpg?sign=1739519579-Im5TEI2d8NjgKGRZsEK1Vl8J91ECEB5C-0-68b9826bce3b05b913bab56a69a4ac24)
图3.8 for循环计算阶乘
注意
在for语句中当采用循环变量递增或递减的方式时,一定要保证循环能够结束,无期限的循环(死循环)将导致程序崩溃。
3.2.2 while循环语句
while循环是PHP中条件循环语句的一种,它的语法格式如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P64_2.jpg?sign=1739519579-yHM0CD1HEkBKeGf7E4y7YJieO5cLKRkH-0-8e77152a709d20e735e3af66450cf019)
当表达式的值为真时,将执行循环体内的PHP语句。执行结束后,再返回到表达式继续进行判断。直到表达式的值为假,才跳出循环。
while循环语句的流程控制图如图3.9所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P64_3.jpg?sign=1739519579-W17mCTsW9g07IhYvcRzZjhjnGfmW76xB-0-11a5676f10c9896ddfd94095cbaef63a)
图3.9 while语句的流程控制图
我们同样以沿着操场跑步的例子来理解while循环。这一次,老师没有要求同学们跑几圈,而是要求当听到老师吹的哨子声时就停下来。同学们每跑一圈,可能会请求一次老师吹哨子。如果老师吹哨子,则停下来,即循环结束;否则,继续跑步,即执行循环。
【例3.05】 依次判断1~10以内的数是否为偶数,如果是,则输出;如果不是,则继续下一次循环。代码如下:(实例位置:资源包\源码\03\3.05)
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P65_1.jpg?sign=1739519579-FnHt1ynny4UcS0DuSMNSD3oxiISG5NTj-0-559e5196e7654475943ad80e5bd5bd8d)
运行结果如图3.10所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P65_2.jpg?sign=1739519579-OxJwzUNeWOGB7UAb0oeaVqXHr0qVx0yj-0-b335ed1c0d6e8ad63f2f45854e0aa8e7)
图3.10 while循环输出10以内的偶数
3.2.3 do…while循环语句
while语句还有另一种形式的表示,即do…while。两者的区别在于,do…while要比while语句多循环一次。当while表达式的值为假时,while循环直接跳出当前循环;而do…while语句则是先执行一遍程序块,然后再对表达式进行判断。do…while语句的流程控制图如图3.11所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P65_3.jpg?sign=1739519579-Tm6sDuQoFgLBQnu2m5ijJ5gcXbQNYDjP-0-8eea9f1938a528a37bec602e51abc4fb)
图3.11 do…while循环语句的流程控制图
依然以沿着操场跑步的例子来理解do…while循环。这一次,老师要求同学们先跑1圈,然后当听到老师吹的哨子声时再停下来。
【例3.06】 分别使用while语句和do…while语句执行相同的代码块,即使用echo语句输出一段内容,并对比两个语句的区别。代码如下:(实例位置:资源包\源码\03\3.06)
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P65_4.jpg?sign=1739519579-TF6KtN5mmCjzVUQsaSrChkB4M8DbXVkg-0-428bf42681130d82c09c4a121dfe6529)
运行结果如图3.12所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P66_2.jpg?sign=1739519579-W0RTTL9q7FGrplWMlCl1RGwC8cWpwTCz-0-4fd527c6b9302dfcb0727dafd1a83f6e)
图3.12 while和do…while的区别
3.3 跳转语句
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P66_3.jpg?sign=1739519579-lpaFRbOLDg0T3wkbPQew4XG6Oi0J1uBQ-0-3cc9783a7f1ba92b38166ab1d8030625)
视频讲解
当循环条件一直满足时,程序将会一直执行下去,就像一辆迷路的车,在某个地方不停地转圆圈。如果希望在中间离开循环,也就是for循环结束计数之前,或者while循环找到结束条件之前,用以下两种方法来做到。
break:完全中止循环。
continue:直接跳到循环的下一次迭代。
3.3.1 break语句
break语句可以终止当前的循环,包括while、do…while、for和switch在内的所有控制语句。以独自一人沿着操场跑步为例,计划跑步10圈。可是在跑到第2圈时,遇到自己的女神或者男神,于是果断停下来,终止跑步,这样就提前终止循环。
【例3.07】 使用一个while循环,while后面的表达式的值为true,即为一个无限循环。在while程序块中声明一个随机数变量$tmp,只有当生成的随机数等于10时,使用break语句跳出循环。代码如下:(实例位置:资源包\源码\03\3.07)
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P66_4.jpg?sign=1739519579-ysuSxUOnNaIGn3bY2qtYidFumQ8v9NMF-0-3a02322a023faf94a8d60172be8d0233)
运行结果如图3.13所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P67_1.jpg?sign=1739519579-XPx51v7M3PoNbedapjjcnZTa1XguwwUh-0-8ce7e4da378631b1ffd07ad63d85b5a8)
图3.13 break语句退出循环
3.3.2 continue语句
continue语句的作用没有break强大,continue只能终止本次循环而进入到下一次循环中,continue也可以指定跳出几重循环。
以独自一人沿着操场跑步为例,计划跑步10圈。当跑到第2圈一半的时候,遇到自己的女神或者男神也在跑步,于是果断停下来,跑回起点等待,制造一次完美邂逅,然后从第3圈开始继续。
【例3.08】 使用for循环输出0~4,当$i等于2时,执行continue语句,此时不执行下面的print语句,跳出该循环,继续执行$i等于3的语句。代码如下:(实例位置:资源包\源码\03\3.08)
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P67_2.jpg?sign=1739519579-7V3g8pycxunwWUax6iX0UdaUEkOULLJV-0-c5a29cde42db8a1aa776cf20ee6ec2c4)
运行结果如图3.14所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P67_3.jpg?sign=1739519579-7Xhs9Kj48ycr1CBljARG1oohxLZXzuLk-0-1966fdb78173875c924e1f9e03acc785)
图3.14 continue语句跳出循环
3.4 小结
本章通过几个简单的数学题学习了PHP的流程控制语句。流程控制语句是程序中必不可少的,也是变化最丰富的技术。无论是入门的数学公式,还是高级的复杂算法,都是通过这几个简单的语句来实现的。相信读者学习完本章之后,通过不断地练习和总结,能够掌握一套自己的方法和技巧。
3.5 实战
3.5.1 验证高斯定理
实例位置:资源包\源码\03\实战\01
使用for循环验证高斯求和1+2+3+…+100之和。运行结果为5050,如图3.15所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P68_1.jpg?sign=1739519579-kgtUBj6BXePTd1FX1FKvYoHqn3BuF3Pu-0-b9c6939f0f334b17c7edac92e30f08e5)
图3.15 实例运行结果
3.5.2 输出三角形金字塔
实例位置:资源包\源码\03\实战\02
输出一个形状呈三角形的金字塔。该金字塔共5行,第1行1颗星,第2行3颗星,第3行5颗星,第4行7颗星,第5行9颗星。运行结果如图3.16所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P68_2.jpg?sign=1739519579-BXi7zmDQvbVuLLfO50rIh30Vh4Xi6pzq-0-e7aa3d2e1074787fdac47e26c3cad4ab)
图3.16 实例运行结果
3.5.3 将学生成绩转化为等级
实例位置:资源包\源码\03\实战\03
将学生成绩转化为等级,划分标准如下:
①优秀:大于等于90分。
②良好:大于等于80分,小于90分。
③及格:大于等于60分,小于80分。
④不及格:小于60分。
使用rand()函数随机生成成绩,输出与该成绩对应的等级。运行结果如图3.17所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P68_3.jpg?sign=1739519579-HVcXL3ABWG8OoJBZr9P5augBLTqZCCWJ-0-0218bda41580ef86e526f7a292a38c53)
图3.17 实例运行结果