从php教程中,我们了解到,一般情况下,php程序都是从第一条php语句开始执行,按顺序执行到最后一句。但有时因为某种情况,需要改变程序的执行php顺序,这就需要对程序的流程进行控制。本节将讲述PHP程序的各种流程控制结构。并针对php教程中涉及到的php控制结构做详细的介绍和使用。
顺序控制结构:代码从左到右,从上到下按照书写顺序执行的控制结构。
php分支结构:指代码可以有多个选择的执行。
php循环结构:当条件成立的时候,执行循环体的代码,当条件不成立的时候,跳出循环,执行循环结构后面的代码。
在php程序里面可以使用if...else语句
格式
if(expr){
statement1;
}else{
statement2;
}
流程图如下图 2.1
列2.1
一辆汽车在高速上行驶,目前的速度是120 该路段超过100为超速,不超过为正常行驶
$speed=120;
if($speed>100){
echo "超速";
}else{
echo "正常行驶";
}
运行结果:
超速
注意:
如果没有false则 else后面的语句可以省略如下:
$speed=120;
if($speed>100){
echo "超速";
}
运行结果:
超速
如果需要在分支结构中运行2行和2行以上的代码,要将这多行代码改写成代码块{语句1;语句2;....},不写在代码块中则会报错!
$speed=120;
if($speed>100){
echo "超速";
echo "请减速";//多行语句组成的叫代码块
}else{
echo "正常行驶";
}
运行结果:
超速请减速
判断当前年份是不是整百年,非整百年如果能被4整除是闰年,整百年如果能被400整除是闰年
$year = 4200;
if($year%100==0){
//整百年如果能被400整除
if($year%400==0){
echo "闰年";
}else{
echo "平年";
}
}else{
//非整百年如果能被4整除
if($year%4==0){
echo "闰年";
}else{
echo "平年";
}
}
运行结果:
平年
格式
if(expr1){
statement1;
}elseif(expr2){
statement2;
}elseif(expr3){
statement3;
}
...
else{
statement4;
}
流程图如下图 2.2
按规定百分试卷 90分以上是优 80~90是良 70~80是中 60~70是及格 低于60分是不及格 那么现在知道小明考了85分 成绩单应该是什么呢?
//小明85分
$mark = 85;
//先判断成绩是否合法
if($mark<0||$mark>100){
echo "成绩出错";
}else if($mark>=90){//90分以上是优
echo "优";
}else if($mark>=80){//80~90是良
echo "良";
}else if($mark>=70){//70~80是中
echo "中";
}else if($mark>=60){//60~70是及格
echo "及格";
}else{//低于60分是不及格
echo "不及格";
}
运行结果:
良
购物卡 满300 9折,满400,8.5折,满500,8折 超过600,打7折得出顾客买东西最终应给多少钱
$price = 1020;
if($price<=0){
echo "价格异常";
}else if($price<300){
echo $price;
}else if($price<400){
echo $price*0.9;
}else if($price<500){
echo $price*0.85;
}else if($price<600){
echo $price*0.8;
}else{
echo $price*0.7;
}
运行结果:
714
格式
switch(variable){
case value1:
statement1;
break;
case value2:
statement2;
break;
case value3:
statement3;
break;
...
default:
default statement;
}
流程图如下图 2.3
按规定百分试卷 90分以上是优 80~90是良 70~80是中 60~70是及格 低于60分是不及格 那么现在想要知道等级良的成绩范围是什么?
$mark = "良";
switch($mark){
case "优":
echo "成绩在90到100分之间";
break;
case "良":
echo "成绩在80到90分之间";
break;
case "中":
echo "成绩在70到80分之间";
break;
case "及格":
echo "成绩在60分到70分之间";
break;
default:
echo "成绩在60分以下";
}
运行结果:
成绩在80到90分之间
注意:
如果case后面没有break,那么程序会会继续向下执行直到碰到break跳出或者直到程序结束
$mark = "良";
switch($mark){
case "优":
echo "成绩在90到100分之间";
break;
case "良":
echo "成绩在80到90分之间";
case "中":
echo "成绩在70到80分之间";
case "及格":
echo "成绩在60分到70分之间";
default:
echo "成绩在60分以下";
}
运行结果:
成绩在80到90分之间成绩在70到80分之间成绩在60分到70分之间成绩在60分以下
case\default 后面全都是冒号
esleif和switch的比较:
1. 所有的switch都可以改写成elseif,但是并非所有的elseif都能改写成switch
2. if运行效率比switch稍微低一点,所以当判断范围值的时候,使用if,当判断的是具体值的时候,使用switch
当条件成立的时候,执行循环体的代码,当条件不成立的时候,跳出循环,执行循环结构后面的代码。
格式
for(expr1;expr2;expr3){
statement;
}
流程图如下图 2.4
计算2000年到3000年闰年的个数
$num = 0;
for($year=2000;$year<=3000;$year++){
//判断是否是整百年
if($year%100==0){
//整百年如果能被400整除 是闰年
if($year%400==0){
$num+=1; //等同于$num = $num+1
}
}else{
//非整百年如果能被4整除 是闰年
if($year%4==0){
$num++;
}
}
}
echo $num."<br/>";
运行结果:
243
发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?
//总共100块钱
$sum = 100;
//共10人 最小1个人
for($i=10;$i>=1;$i--){
//假如另外几个都是给12元 剩下的钱给这个人 则得出最小值 最小值小于6的时候默认是6
$min = ($sum - 12 * ($i-1))>6?($sum - 12 * ($i-1)):6;
//假如另外几个都是给6元 剩下的钱给这个人 则得出最大值 最大值大于12的时候默认是12
$max = ($sum - 6 * ($i-1))<12?($sum - 6 * ($i-1)):12;
//根据最小值和最大值产生随机数 比rand函数更加快
$randNum = mt_rand($min,$max);
//减掉已经发的红包,得到剩下的钱
$sum -= $randNum;
echo $randNum."<br/>";
}
运行结果是:
动态的红包(注每次结果不一样)
格式
expr; 1
while(expr 2){
statement 4;
expr; 3
}
流程图如图 2.5 for语句的流程图
计算2000年到3000年闰年的个数
$num = 0;
$year = 2000;
while($year<=3000){
if($year%100==0){
if($year%400==0){
$num+=1;
}
}else{
if($year%4==0){
$num+=1;
}
}
$year++;
}
echo $num;
运行结果是:
243
格式
expr1;
do{
statement;
expr2;
}
while(expr3);
流程图如下图 2.5
注意:先执行代码,然后再判断,而for和while是先判断再执行代码
练习: 1/2-1/3+1/4-1/5+....+1/98-1/99+1/100
$sum = 0;
$a = 2;
do{
//判断是不是偶数 偶数前面是加号 奇数前面是减号
if($a%2==0){
$sum+=1/$a; //$sum = $sum+1/$a;
}else{
$sum-=1/$a;
}
$a++;
}
while($a<=100);
echo $sum;
运行结果是:
0.31182782069
格式
foreach($array as $key=>$value){
// 针对于$key和value的一些操作
}
Continue:跳出本次循环,直接进入下一次循环。
for($i=1;$i<=10;$i++){
if($i==5){ //$i=5 的时候跳出当前循环
continue;
}
echo $i."<br/>";
}
运行结果:
1 2 3 4 6 7 8 9 10
1】选择题
1.有else if块的选择结构是( )
A.基本if选择结构
B.if-else选择结构
C.if-else if选择结构
D.switch选择结构
2.下列关于if-else if选择结构的说法正确的是( )
A.多个else if块之间的顺序可以改变,改变之后对程序的执行结果没有影响
B. 多个else if块之间的顺序可以改变,改变之后可能对程序的执行结果有影响
C. 多个else if块之间的顺序不可以改变,改变后程序编译不通过
D. 多个else if块之间的顺序可以改变,改变后程序编译可以通过
3.下面程序的执行结果是( )
$shidu=45;
if($shidu>=80){
echo "要下雨了";
}else if($shidu>=50){
echo "天很阴";
}else if($shidu>=30){
echo "很舒适";
} else if($shidu>=0){
echo "很干燥";
}
A.要下雨了 B.天很阴 C.很舒适 D.很干燥
4.下面有关switch选择结构语句的说法正确的是( )
A.switch选择结构可以完全替代if-else if选择结构
B.条件判断为等值判断,并且判断的条件为字符串时,可以使用switch选择结构
C.条件判断为等值判断,并且判断的条件为整型变量时,可以使用switch选择结构
D.条件判断为等值判断,并且判断的条件为字符时,可以使用switch选择结构
5.下面代码执行结果正确的是( )
$j=5;
switch($j){
default:
echo "no result";
case 1:
echo "周一";
case 2:
echo "周二 ";
case 3:
echo "周三";
case 4:
echo "周四";
case 5:
echo "周五";
case 6:
case 7:
echo "周末";
}
A.周五 B.周五周末no result C.周五周末 D.语法错,没有运行结果
6.下列关于while循环、do-while循环和for循环说法错误的是( )
A.while循环先执行条件判断,do-while循环执行循环体
B.do-while循环结束的条件是关键字while后的条件表达式不成立
C.for循环结构中的3个表达式缺一不可
D.while循环能够实现的操作,for循环也能实现
7.不论循环条件判断的结果是什么( )循环将至少执行一次
A.while
B.do-while
C.for
D.以上都不是
8.以下代码的输出结果是( )
for($i=1;$i<=10;$i++){
if($i%2==0 || $i%5==0){
continue;
}
echo $i." ";
}
A.1
B.1 3 4
C.1 3 5 7 9
D.1 3 7 9
9.有如下代码片断,下面描述正确的是( )
$i=10;
while($i==0){
$i=$i-1;
}
A.while循环执行10次
B.死循环,将一直执行下去
C.循环一次也不执行
D.循环将执行1次
10.阅读以下代码,正确的运行结果是( )
$num=6;
for($i=1;$i<=10;$i++){
if(($i+$num)>10){
break;
}
echo $i." ";
}
A.1 2 3 4 5 6
B.7 8 9 10
C.1 2 3 4
D.5 6 7
2】填空题
1.代码如下,最后输出的结果是____
$boo = "false";
if($boo==false){
echo "true";
}else{
echo "false";
}
2.一段程序如下,最后输出的结果是____
$monk = 2;
switch($monk){
case 1:
echo "挑水吃";
case 2:
echo "抬水吃";
case 3:
echo "没水吃";
default:
echo "不知道";
}
3.一段代码如下,请问最后输出的结果是__
for($a = 1;$a<=10;$a++){
$sum = 0;
$sum+=$a;
}
echo $sum;
4.有一段代码如下,请问最后的结果是__
$sum = 0;
$a = 1;
while($a<=10){
$sum+=$a;
}
echo $a;
5.一段代码如下,请问最后输出的结果是__
$sum = 0;
for($i=1;$i<=10;$i++){
if($i==5){
break;
}
$sum+=$i;
}
echo $sum;
6.一段代码如下,请问最后输出的结果是__
$sum = 0;
for($i=1;$i<=10;$i++){
if($i==5){
continue;
}
$sum+=$i;
}
echo $sum;
7.一段代码如下,请问最后输出的结果是____
$sum = 0;
$i = 11;
do{
$sum+=$i;
$i++;
}
while($i<=10);
echo $sum;
8.一段代码如下,请问最后输出的结果是____
$sum = 0;
$i=11;
while($i<=10){
$sum+=$i;
}
echo $sum;
9.一段代码如下,请问最后输出的结果是__
$sum = 0;
for($i=1;$i<=5;$i++){
for($j=$i-1;$j<=5;$j++){
$sum++;
}
}
echo $sum;
10.一段代码如下,请问最后输出的结果是__
$sum = 0;
for($i=5;$i>=0;$i--){
for($j=1;$j<=$i;$j++){
$sum++;
}
}
echo $sum;
答案:
选择题:C B C C C D B D C C
填空题:false 抬水吃没水吃不知道 10 死循环 10 50 11 0 20 1