开发者学堂课程【PHP 基础入门课程(下):循环控制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/710/detail/12620
循环控制
目标:掌握循环控制的基本原理和实际需求,利用循环控制实现循环内部控制
提问:如果在循环执行过程中出现了某些异常或者某些不符合条件的,能怎么办?
回答:循环控制
1.概念
循环控制:即循环体内通过代码对控制循环如何执行
(1)循环体内控制代码的执行方向
(2)循环控制是为了增加程序的健壮性,让开发者可以在循环内部把握循环的正确执行。
(3)根据需求(条件)进行控制
.终止单次循环体执行:continue[层级],层级默认1(直接进行下一次循环)
.终止循环(循环结束);break[层级],层级默认1
2.步骤
(1)循环开始
(2)循环体内是否需要判定条件
.条件满足:选择控制
确定控制层级(单层循环不需要)
.条件不满足:不需要控制
3.示例
(1.)求出1-100之间所有非3的倍数的和
#定义初始变量(使用 while 循环)
$i = 1;
$sum = 0;
#记录和
while($i <= 100){
#确定当前变量$i 是否是3的倍数
if($i % 3 == 0){
#是3的倍数:这个值不记录:但是后续的代码不用再执行(注意条件要变化)
$i++;
continue;
#continue 之后的循环体不执行
}
#求和:同时变更变量
$sum += $i++;
#等价于:$sum=$sum + $i++
(后置自操作,先使用原值,后自操作)
}
实例操作:
<?php
#循环控制
#求1-100之间不是3的倍数的整数的和
$i = 1;
$sum=0;
while($i <= 100){
#先判定
if($i % 3 == 0){
#是3的倍数
#终止向下执行循环体:没有价值了
continue;
}
#继续执行:非3的倍数
$sum+= $i++;
}
但是这个循环有个致命问题,循环变量永远没有改变,所以此时要对他进行改变,所以进行一个$sum+= $i++;
,但是他还是死循环,
所以要进行一个条件变更。
while($i <= 100){
#先判定
if($i % 3 == 0){
#是3的倍数
#终止向下执行循环体:没有价值了
$i++;
continue;
}
#继续执行:非3的倍数
$sum+= $i++;
}
这种操作就基于这个知识点本身而讲,这样做比较复杂。
运行结果:
(2.)求出1-100之间所有的数的和
#定义初始变量
$i = 1;
$sum = 0;
#开始循环:条件永远为真
while tTRUE){
#外部没有进行条件控制:说明循环是死循环,我们要在内部保证循环不会一直执行
if($i > 100){
#已经不满足需求:循环没有必要继续
break;
}
#如果前面条件不满足:说明当前是满足循环要求的,继续执行
$sum += $i++:
}
实例操作:
#求和1-100(内部控制条件)
$i = 1;
$sum=0;
while(TRUE){
#循环控制
if($i > 100){
break;
}
#求和
$sum+= $i++
}
echo $sum;
(3.)九九乘法表优化
#原九九乘法表
for($i = 1;$i <= 9;$i++){
#将打印9列的循环移入到能打印行的循环中:实现9行9列输出
for($j = 1;$j <= 9;$j++){
#输出:确保列数不能大于行数
if($j <= $i){
#有效输出位置:列号在前,行号在后
echo "$i * $i =". $i * $i ."';
#输出带一个空格
#"$j* $i ="
是一个字符串只会解析变量,Sit $i
是一个乘法表达式,会得出结果
}
}
#9行其实就是一个换行符代表换一行
echo '<br/>';}
#问题:当内存循环$i>$i
之后,虽然不会输出,但是内层 for 循环会一直执行直到$i>9
,这部分是无效执行:所以应当优化,即内存循环$j>$i
之后已经没有执行的意义了(结束循环)
for($i = 1;$i <= 9;Si++){
#将打印9列的循环移入到能打印行的循环中:实现9行9列输出
for(sj = 1;$j <= 9;$j++){
#输出:确保列数不能大于行数
if($j <= $i){
#有效输出位置:列号在前,行号在后
echo "$i * $i =". $i* $i .’ ':
#输出带一个空格
#"$j *$i ="
是一个字符串只会解析变量,sj*si
是一个乘法表达式,会得出结果
}
}else{
#循环控制:进入 e1se 说明$;>$i
,已经失去意义了
break;
#当前 break 是控制所属循环(j 循环),所以终止也是当前j循环,进入到 i 据环执行<br>
}
}
#9行其实就是一个换行符代表换一行
echo '<br/>':}
实例操作优化版九九乘法表
for($i = 1;$i i <= 9;$i++){
for($j = 1;$j <= 9;$j++){
echo "$j * $i = " . $j * $i .' ';
}
#换行
echo '<br/>';
}
运行结果:
输出九九八十一个,但应该是有条件的
for($i = 1;$i i <= 9;$i++){
for($j = 1;$j <= 9;$j++){
if($j <= $i){
echo "$j * $i = " . $j * $i .' ';
}else{
#此时 j 已经大于 i:没有必要内存循环再执行
break;
}
}
#换行
echo '<br/>';
}
运行结果:
其中有些问题,例如 i=1.j=1
第一次,j<=9
满足条件,j1<=1
输出,此时循环进入到 j++
,j 变成2,2满足条件<=9,但2进来已经没有含义了,2一定是大于 i 的,所以 if 不会执行,但循环依然会从2变到3,4,5,6,7直到变到10,循环结束,此时进行控制,
#优版乘法表
for($i = 1;$i <= 9;$i++){
for($j = 1;$j <= 9;$j++){
if($j <= $i){
echo "$j * $i = ". $j * $i .' ';
}else{
#此时 j 已经大于 i,没有必要内存循环在执行
Break;
}
}
#换行
echo '<br/>';
}
运行结果与之前效果一样
#最优版乘法表
for($i = 1;$i <= 9;$i++){
for($j = 1;$j <= $i;$j++){
echo "$j * $i = ". $j * $i .' ';
}
#换行
echo '<br/>';
}
运行结果:再次执行效果一样
4.continue 流程控制
graph lR
A(循环开始)-->B{循环条件判定
大条件}
B->|不满足条件|D((循环结束))
B-->|满足条件|c[执行循环体]
C-->E{内部条件判定
后续代码是否需要执行}
E-->|需要|F[后续代码继续执行]
E-->|不需要|B
F-->B
开始循环条件判定大条件,大条件如果不满足的循环自然就结束了如果,满足条件进去执行循环,然后循环体之后要考虑内部是否有条件判定,这种条件就是后续代码有没有必要执行,当前条件是否满足,如果说后面已经不需要了,那么此时就回来,那么这种不需要 continue,如果需要执行就不需要 continue,把整个循环执行完在执行代码。
Break 流程控制
大条件外部的进来之后执行,执行之后看看内部条件判定是否需要继续执行,不需要直接让循环结束,不要再去执行了,如果需要,后期代码继续执行,那么都有一个特点就是不论 continue 还是 Break 他都会让后续代码不执行,区别就是 continue 会让循环再来,进行下一次,而 break 是直接让循环结束。
5.小结
(1)循环控制是在循环内部提供了一种可以控制循环的机制
·内部控制,给开发者提供灵活性
·内部控制,给开发者提供优化空间(省去不必要的循环)
(2)循环控制分为两种
·终止单次循环:continue
·终止整个循环:break
(3)循环控制有层级,如果在多层循环中需要控制到不同的层级,可以使用层级数
·continue[N]
:回到 N 层循环继续下一次循环开始
·break[N]
:跳出到 N+1层循环,如果没有 N+1层循环,循环结束
·N 如果为1,那么可以省去