第3章 流程控制语句
(视频讲解:51分钟)
学习了PHP基础后,相信读者对PHP语言的基本运算有了一些了解,那么现在试着计算下面几个问题:输出10以内的偶数、计算100的阶乘、列举1000以内的所有素数。本章就来学习使用PHP语言中的流程控制语句解决上述问题。PHP的流程控制语句有两种:条件控制语句和循环控制语句。合理使用这些控制结构可以使程序流程清晰、可读性强,从而提高程序开发效率。
学习摘要:
if语句
switch语句
for循环语句
while循环语句
do…while循环语句
跳转语句
3.1 条件控制语句
视频讲解
在生活中,我们总是要做出许多决策,程序也是一样。下面给出几个常见的例子:
如果购买成功,用户余额减少,用户积分增多。
如果输入的用户名和密码正确,提示登录成功,进入网站,否则,提示登录失败。
如果用户使用微信登录,则使用微信扫一扫;如果使用QQ登录,则输入QQ号和密码;如果使用微博登录,则输入微博号和密码;如果使用手机号登录,则输入手机号和密码。
以上例子中的判断,就是程序中的条件控制语句。按照条件选择执行不同的代码片段。条件控制语句主要有if、if…else、if…elseif…else和switch 4种。下面分别进行讲解。
3.1.1 if语句
PHP的if语句的格式如下:
如果表达式的值为真,那么就顺序执行语句;否则,就会跳过该条语句,再往下执行。如果需要执行的语句不止一条,那么可以使用“{}”,在“{}”中的语句被称为语句组,其格式如下:
if语句的流程就像一辆运行的火车,从A站出发,可以直接到达C站,也可以经过B站,然后再到达C站,如图3.1所示。
图3.1 if语句流程控制图
【例3.01】 使用rand()函数生成一个随机数$num,然后判断这个随机数是不是偶数,如果是,则输出结果。代码如下:(实例位置:资源包\源码\03\3.01)
运行结果如图3.2所示。
图3.2 判断随机数是否为偶数
说明
rand()函数的作用是取得一个随机的整数,每次刷新页面后,会生成一个新的随机数,可能与图3.2所示不同。
3.1.2 if…else语句
大多时候,总是需要在满足某个条件时执行一条语句,而在不满足该条件时执行其他语句。这时可以使用if…else语句,该语法格式如下:
该语句的含义为:当表达式的值为真时,执行语句1;如果表达式的值为假,则执行语句2。就像一辆运行的火车,只有两条轨道可以选择,如图3.3所示。
图3.3 if…else语句流程控制图
3.1.3 elseif语句
if…else语句只能选择两种结果:要么执行语句1,要么执行语句2。但有时会出现两种以上的选择,例如,一个班的考试成绩,如果是90分以上,则为“优秀”;如果是60~90分的,则为“良好”;如果低于60分,则为“不及格”。这时可以使用elseif语句来执行,语法格式如下:
elseif语句的流程就像一辆运行的火车,从A站出发到达B站,有多条线路可以选择,根据铁路局的不同指示,选择相应的路线,如图3.4所示。
图3.4 elseif语句的流程控制图
【例3.02】 通过elseif语句,判断今天是这个月的上、中或下旬。代码如下:(实例位置:资源包\源码\03\3.02)
运行结果如图3.5所示。
图3.5 判断是上、中或下旬
3.1.4 switch语句
虽然elseif语句可以进行多种选择,但如果条件较多时,就会变得十分烦琐。为了避免if语句过于冗长,提高程序的可读性,可以使用switch分支控制语句。switch语句的语法格式如下:
switch语句根据变量或表达式的值,依次与case中常量表达式的值相比较,如果不相等,继续查找下一个case;如果相等,就执行对应的语句,直到switch语句结束或遇到break为止。一般来说,switch语句最终都有一个默认值default,如果在前面的case中没有找到相符的条件,则输出默认语句,和else语句类似。
【例3.03】 明日学院网站支持第三方登录,第三方登录包括QQ登录、微信登录、微博登录等。根据不同的登录方式,需要调用相应的第三方接口,这时,可以根据网址中传递的值不同,使用switch语句判断用户选择了哪一个第三方应用,然后调用该应用的接口。代码如下:(实例位置:资源包\源码\03\3.03)
运行结果如图3.6所示。
图3.6 switch多重判断语句
注意
switch语句在执行时,即使遇到符合要求的case语句段,也会继续往下执行,直到switch语句结束。为了避免这种浪费时间和资源的行为,一定要在每个case语句段后加上break语句。这里break语句的意思是跳出当前循环,在3.3.1节中将详细介绍break语句。
3.2 循环控制语句
视频讲解
对于大多数人来说,反复地做同样的事情会让人厌烦,但是对计算机而言,它们却非常擅长去完成重复的任务。计算机程序通常会周而复始地重复同样的步骤,这称为循环。循环主要有两种类型:
重复一定次数的循环,称为计数循环,如for循环。
重复直至发生某种情况时结束的循环,称为条件循环(conditional loop),因为只要条件为真,这种循环会一直持续下去,如while循环和do…while循环。
3.2.1 for循环语句
for循环是PHP的计数循环结构,它的语法格式如下:
其中,初始化表达式在第一次循环时无条件取一次值;条件表达式在每次循环开始前求值,如果值为真,则执行循环体里面的语句,否则跳出循环,继续往下执行;迭代表达式在每次循环后被执行。for循环语句的流程控制图如图3.7所示。
图3.7 for循环语句的流程控制图
我们以现实生活中的例子来理解for循环的执行流程。在体育课上,体育老师要求同学们沿着环形操场跑步3圈。老师从0开始计数,每次跑完1圈,将数量加1。当完成第3圈时,同学会停下来,即循环结束。
【例3.04】 通过for循环来计算100的阶乘,即1×2×3×4×…×100。代码如下:(实例位置:资源包\源码\03\3.04)
上述代码中,第一步,执行for循环的初始表达式,即为$i赋值为1。第二步,判断条件表达式,即$i是否小于或等于100,如果判断的结果为真,则执行下面的程序块,将$sum乘以当前的$i;否则跳出循环,不再继续执行。第三步,执行迭代表达式,即将$i加1。此时,第一次循环结束,$i的值为2。然后判断$i是否小于或等于100,重复第一次的操作。当$i为100时,执行第100次程序块代码。然后$i继续迭代,值为101。此时,判断表达式的结果为假,循环结束,不再执行。运行结果如图3.8所示。
图3.8 for循环计算阶乘
注意
在for语句中当采用循环变量递增或递减的方式时,一定要保证循环能够结束,无期限的循环(死循环)将导致程序崩溃。
3.2.2 while循环语句
while循环是PHP中条件循环语句的一种,它的语法格式如下:
当表达式的值为真时,将执行循环体内的PHP语句。执行结束后,再返回到表达式继续进行判断。直到表达式的值为假,才跳出循环。
while循环语句的流程控制图如图3.9所示。
图3.9 while语句的流程控制图
我们同样以沿着操场跑步的例子来理解while循环。这一次,老师没有要求同学们跑几圈,而是要求当听到老师吹的哨子声时就停下来。同学们每跑一圈,可能会请求一次老师吹哨子。如果老师吹哨子,则停下来,即循环结束;否则,继续跑步,即执行循环。
【例3.05】 依次判断1~10以内的数是否为偶数,如果是,则输出;如果不是,则继续下一次循环。代码如下:(实例位置:资源包\源码\03\3.05)
运行结果如图3.10所示。
图3.10 while循环输出10以内的偶数
3.2.3 do…while循环语句
while语句还有另一种形式的表示,即do…while。两者的区别在于,do…while要比while语句多循环一次。当while表达式的值为假时,while循环直接跳出当前循环;而do…while语句则是先执行一遍程序块,然后再对表达式进行判断。do…while语句的流程控制图如图3.11所示。
图3.11 do…while循环语句的流程控制图
依然以沿着操场跑步的例子来理解do…while循环。这一次,老师要求同学们先跑1圈,然后当听到老师吹的哨子声时再停下来。
【例3.06】 分别使用while语句和do…while语句执行相同的代码块,即使用echo语句输出一段内容,并对比两个语句的区别。代码如下:(实例位置:资源包\源码\03\3.06)
运行结果如图3.12所示。
图3.12 while和do…while的区别
3.3 跳转语句
视频讲解
当循环条件一直满足时,程序将会一直执行下去,就像一辆迷路的车,在某个地方不停地转圆圈。如果希望在中间离开循环,也就是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)
运行结果如图3.13所示。
图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)
运行结果如图3.14所示。
图3.14 continue语句跳出循环
3.4 小结
本章通过几个简单的数学题学习了PHP的流程控制语句。流程控制语句是程序中必不可少的,也是变化最丰富的技术。无论是入门的数学公式,还是高级的复杂算法,都是通过这几个简单的语句来实现的。相信读者学习完本章之后,通过不断地练习和总结,能够掌握一套自己的方法和技巧。
3.5 实战
3.5.1 验证高斯定理
实例位置:资源包\源码\03\实战\01
使用for循环验证高斯求和1+2+3+…+100之和。运行结果为5050,如图3.15所示。
图3.15 实例运行结果
3.5.2 输出三角形金字塔
实例位置:资源包\源码\03\实战\02
输出一个形状呈三角形的金字塔。该金字塔共5行,第1行1颗星,第2行3颗星,第3行5颗星,第4行7颗星,第5行9颗星。运行结果如图3.16所示。
图3.16 实例运行结果
3.5.3 将学生成绩转化为等级
实例位置:资源包\源码\03\实战\03
将学生成绩转化为等级,划分标准如下:
①优秀:大于等于90分。
②良好:大于等于80分,小于90分。
③及格:大于等于60分,小于80分。
④不及格:小于60分。
使用rand()函数随机生成成绩,输出与该成绩对应的等级。运行结果如图3.17所示。
图3.17 实例运行结果