
3.2 循环控制语句
对大多数人来说,反复做同样的事情会让人厌烦,但是对计算机而言,它们却非常擅长去完成重复的任务。计算机程序通常会周而复始地重复同样的步骤,这称为循环。循环主要有两种类型。
重复一定次数的循环,称为计数循环,例如for循环。
重复直至发生某种情况时结束的循环,称为条件循环(conditional loop),因为只要条件为真,这种循环就会一直持续下去,例如while循环和do...while循环。
3.2.1 for循环语句

for循环是PHP的计数循环结构,它的语法格式为:

其中,初始化表达式在第一次循环时无条件取一次值;条件表达式在每次循环开始前求值,如果值为真,则执行循环体里面的语句,否则跳出循环,继续往下执行;迭代表达式在每次循环后被执行。for循环语句的流程控制图如图3.7所示。
我们以现实生活中的例子来理解for循环的执行流程。在体育课上,体育老师要求同学们沿着环形操场跑步3圈。老师从0开始计数,每次跑完1圈,将数量加1。当完成第3圈时,同学会停下来,即循环结束。

图3.7 for循环语句的流程控制图
通过for循环来计算100的阶乘
通过for循环来计算100的阶乘,即1*2*3*4…*100。具体代码如下:

上述代码中,第一步,执行for循环的初始表达式,即为$i赋值为1。第二步,判断条件表达式,即$i是否小于或等于100,如果判断的结果为True,则执行下面的程序块,将$sum乘以当前的$i,否则跳出循环,不再继续执行。第三步,执行迭代表达式,即将$i加1。此时,第一次循环结束,$i的值为2。然后判断$i是否小于或等于100,重复第一次的操作。当$i为100时,执行第100次程序块代码。然后$i继续迭代,值为101。此时,判断表达式的结果为False,循环结束,不再执行,运行结果如图3.8所示。

图3.8 for循环计算100的阶乘
学习笔记
在for语句中无论采用的是循环变量递增的方式还是循环变量递减的方式,前提都一定要保证循环能够结束,无期限的循环(死循环)将导致程序崩溃。
3.2.2 while循环语句

while循环是PHP中条件循环语句的一种,它的语法格式为:

当表达式的值为真时,将执行循环体内的语句。执行结束后,再返回到表达式继续进行判断。直到表达式的值为假,才跳出循环。
while循环语句的流程控制图如图3.9所示。

图3.9 while循环语句的流程控制图
我们同样以沿着操场跑步的例子来理解while循环。这一次,老师没有要求同学们跑几圈,而是要求当听到老师吹的哨子声时就停下来。同学们每跑一圈,可能会请求老师吹一次哨子。如果老师吹哨子,则停下来,即循环结束。否则,继续跑步,即执行循环。
输出10以内的偶数
本示例将依次判断1~10以内的数是否为偶数,如果是偶数,则输出;如果不是偶数,则继续执行下一次循环。代码如下:

while循环输出10以内的偶数的运行结果如图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圈,然后当听到老师吹的哨子声时再停下来。
对比while循环语句和do...while循环语句的区别
分别使用while循环语句和do...while循环语句执行相同的代码块,即使用echo语句输出一段内容,并对比这两个语句的区别,代码如下:

运行结果如图3.12所示。

图3.12 while循环语句和do...while循环语句的区别