![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=1739374490-nuznQJfSJ0umN0e7ABjyoipe8mZBo8qv-0-466251648f431fcebd2b0af0a06d36b1)
视频讲解
在生活中,我们总是要做出许多决策,程序也是一样。下面给出几个常见的例子:
如果购买成功,用户余额减少,用户积分增多。
如果输入的用户名和密码正确,提示登录成功,进入网站,否则,提示登录失败。
如果用户使用微信登录,则使用微信扫一扫;如果使用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=1739374490-u0ITy78iorCstZVJv5tef6TQkk4vvvKq-0-7f18d43f90365c36453f42e63ee14ba7)
如果表达式的值为真,那么就顺序执行语句;否则,就会跳过该条语句,再往下执行。如果需要执行的语句不止一条,那么可以使用“{}”,在“{}”中的语句被称为语句组,其格式如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P58_3.jpg?sign=1739374490-zsZEKsT6rEiTJYLqaUWIWckGLPa2VzVj-0-e9ca881cd4cf0f8cc5f1530410b18a4f)
if语句的流程就像一辆运行的火车,从A站出发,可以直接到达C站,也可以经过B站,然后再到达C站,如图3.1所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P58_4.jpg?sign=1739374490-pUF5kYHgNxOrOoOXBqt2DskkiYnKbEFu-0-2db419c0bc83f2abbf43107c4c939315)
图3.1 if语句流程控制图
【例3.01】 使用rand()函数生成一个随机数$num,然后判断这个随机数是不是偶数,如果是,则输出结果。代码如下:(实例位置:资源包\源码\03\3.01)
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P59_1.jpg?sign=1739374490-Vlo9BTQ7JYlS0MMP0BJNHJC7U9GuELap-0-5f65474334a72d56e9e216d2b3d60713)
运行结果如图3.2所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P59_2.jpg?sign=1739374490-gZ0BmXaV4Ow3UOFTXDzfUdSsD9xhTg0f-0-82660ec9645b1f87c85ecbcebff621f3)
图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=1739374490-dedg8PAp0J33sdzP86THocEfmiqCi6dV-0-f8acc9284d5ebe9a46de7f4ca0ea43e1)
该语句的含义为:当表达式的值为真时,执行语句1;如果表达式的值为假,则执行语句2。就像一辆运行的火车,只有两条轨道可以选择,如图3.3所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P59_4.jpg?sign=1739374490-j8uWcqAs1Q6Ycw793dKssIIFX9pjGn83-0-7afbf09e4e3c702bf617c8e0d81c6b7a)
图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=1739374490-XbkDvMCabjj9HjdcRpEI82200OlVQGqS-0-7de4097ee87df0f005b74e159cd789a1)
elseif语句的流程就像一辆运行的火车,从A站出发到达B站,有多条线路可以选择,根据铁路局的不同指示,选择相应的路线,如图3.4所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P60_2.jpg?sign=1739374490-m9fF0lLliAvJMjJE2t2URwNYsHt67JOT-0-cd45a9b8b44240dd0b0bd90783ceff96)
图3.4 elseif语句的流程控制图
【例3.02】 通过elseif语句,判断今天是这个月的上、中或下旬。代码如下:(实例位置:资源包\源码\03\3.02)
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P60_3.jpg?sign=1739374490-82jEEvdK2konxlupZpf1DFHnkfqWQy6j-0-06ec16283d3cc59ebfbdd34cf1b5daea)
运行结果如图3.5所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P61_1.jpg?sign=1739374490-uxiMX5HGCOEVUhBCstPGlmdaX11DYILU-0-1757ec3d65ed077006dd9d1cf7aae168)
图3.5 判断是上、中或下旬
3.1.4 switch语句
虽然elseif语句可以进行多种选择,但如果条件较多时,就会变得十分烦琐。为了避免if语句过于冗长,提高程序的可读性,可以使用switch分支控制语句。switch语句的语法格式如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P61_2.jpg?sign=1739374490-wAYW5hYpXmoH6qpzkfBAf7ehRfeM24Nu-0-bd3f5f84a03c4076c272131091181f89)
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=1739374490-1aWx5V2tb4B6Hw4Ns4Pc8drcOm4GB8E9-0-f1588ae6abb8367e7fd26a9ec093bb6d)
运行结果如图3.6所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P62_2.jpg?sign=1739374490-zNyKeWZ43V2aIOmBOV0YvSuAUFHHhttF-0-84d74f74b71f5f7cf2fa5a9eb72bee09)
图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=1739374490-HXwtiv5BW5LWovcsstme5PDTaFhl6CaS-0-b63eaf8c118480e606ef480e615ee9d8)
视频讲解
对于大多数人来说,反复地做同样的事情会让人厌烦,但是对计算机而言,它们却非常擅长去完成重复的任务。计算机程序通常会周而复始地重复同样的步骤,这称为循环。循环主要有两种类型:
重复一定次数的循环,称为计数循环,如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=1739374490-0vcEJnQCSV2GrASE38GvUpgHCnmpmhJn-0-31934277e0c9669b7b73e9980e3beb64)
其中,初始化表达式在第一次循环时无条件取一次值;条件表达式在每次循环开始前求值,如果值为真,则执行循环体里面的语句,否则跳出循环,继续往下执行;迭代表达式在每次循环后被执行。for循环语句的流程控制图如图3.7所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P63_2.jpg?sign=1739374490-aLfWp8GD8P8ajIsfK2byv0c8Hlg6u0Ip-0-2a62e6b287b173fdcb20ce0179834f6b)
图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=1739374490-pUS6bE6scWWbhLQMiENtDHpA9AS29GKy-0-5d8f6fc5a51a2ff7e1f60a4a47b7a33d)
上述代码中,第一步,执行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=1739374490-ebnFS19JTyIGjwyj5el4vznBvdOk6Tkt-0-0b41083d827a32ee8f3620dc2074eb18)
图3.8 for循环计算阶乘
注意
在for语句中当采用循环变量递增或递减的方式时,一定要保证循环能够结束,无期限的循环(死循环)将导致程序崩溃。
3.2.2 while循环语句
while循环是PHP中条件循环语句的一种,它的语法格式如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P64_2.jpg?sign=1739374490-cd6IMuFFfHnZTtaxPJdi6IUgXoZ6IKx8-0-d3f89cf6ffb9f3f3dcbd6c36efddc62c)
当表达式的值为真时,将执行循环体内的PHP语句。执行结束后,再返回到表达式继续进行判断。直到表达式的值为假,才跳出循环。
while循环语句的流程控制图如图3.9所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P64_3.jpg?sign=1739374490-JzD8HaUjMXoeGpUHqr22WOQENt9fmEfU-0-ad1bdd56f5bdcfd0a1b5ad5efe71358e)
图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=1739374490-rVXi9BMrFnALAIj16yhR393VB5eO4Ma9-0-71910cb3197e3163f797a11027a5ebb9)
运行结果如图3.10所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P65_2.jpg?sign=1739374490-sJCR5g7fmpLIiO2gvzq7PLP5JwQrNMaE-0-8db88600aff45258ec65f1553f6841e9)
图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=1739374490-JJb4wuTEJSbFQNOwYTSwAbWCEZPcLlA0-0-9e968e52cb9a979ee9c137ea43d3f0fd)
图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=1739374490-5rba39G1XpjZFXwDK8bS3jWHRl7uNmHB-0-88a7ed69035f1776bdf936a09d171084)
运行结果如图3.12所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P66_2.jpg?sign=1739374490-kKWJqYD8bTI2ySsMGnO68XsP6ItBLm0l-0-7db37be113f0be2388b57bb6b9e50ef5)
图3.12 while和do…while的区别
3.3 跳转语句
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P66_3.jpg?sign=1739374490-hGICFaaM86JuiPdQVt2rRF6DmYNHooql-0-d22b925666044f5f498fcf3a7abda927)
视频讲解
当循环条件一直满足时,程序将会一直执行下去,就像一辆迷路的车,在某个地方不停地转圆圈。如果希望在中间离开循环,也就是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=1739374490-tRwtYPEXNFaBhiSdrzsfbd711WB1RzN4-0-871cd869529e1843fc80a375cb70942d)
运行结果如图3.13所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P67_1.jpg?sign=1739374490-rWBG3o9lhFfHBZzdZ7F57V9WPKdrTlOW-0-cdb5074891e15789dee15be0a528f6ae)
图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=1739374490-yChX25QsdjyFmaxpkhhJQ9S3usWjMmHp-0-41b9613352ebae24221bed2bf9a6845d)
运行结果如图3.14所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P67_3.jpg?sign=1739374490-PQVAUNjpdI1TEF2l7uuPSvDQKBZknIHF-0-a273e2c4d4b0b180c11f1adf555f081a)
图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=1739374490-8GF59UOICr8LBykUsI7Clq61bqgkgStH-0-55fa4f53dea3bf0741251c16c264ea69)
图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=1739374490-hSHt7aB8hVyTdSe4UyPrAlhNnTuPA091-0-d3355e0ed9999cd16d24bd4fa9a2f873)
图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=1739374490-oKfbjjgNQ62pkWS94orgrbEZmfhjPHB2-0-5bbcaa377843b55ef8fe9673f84d04f7)
图3.17 实例运行结果