首页 > PHP资讯 > PHP培训技术 > php教程第二节:php控制结构详解

php教程第二节:php控制结构详解

PHP培训技术

第二章PHP控制结构

从php教程中,我们了解到,一般情况下,php程序都是从第一条php语句开始执行,按顺序执行到最后一句。但有时因为某种情况,需要改变程序的执行php顺序,这就需要对程序的流程进行控制。本节将讲述PHP程序的各种流程控制结构。并针对php教程中涉及到的php控制结构做详细的介绍和使用。

  • 2.1 php控制结构

    • 控制代码运行顺序的语句
      • 在我们日常生活中也是非常常见比如小明需要钉钉子准备挂婚纱照。钉钉子的时候不小心把手割破了如果严重就需要去医院不严重可以包扎下继续钉钉子(这种可选择的情况就是分支结构)而不断的钉钉子直到定完 这就是一个循环结构
  • 2.2 控制结构的分类

    • 顺序控制结构:代码从左到右,从上到下按照书写顺序执行的控制结构。

      • 列如:小明早晨起来准备刷牙,那么正常的顺序应该是:先挤牙膏,再刷牙。这样按顺序执行,而不能先刷牙后挤牙膏,这样小明就不能够正常的完成刷牙这件事了。
    • php分支结构:指代码可以有多个选择的执行。

      • 分支结构又分为单分支和多分支
        • 单分支:程序执行的流程不超过2个的结构(双分支)
          • 列如:马上要举行运动会了,我可以选择参加也可以选择不参加。像这种就是一种双分支结构
        • 多分支:程序执行的流程超过了2个以上的结构。
          • 列如:假如小明想从南京去北京,现在他可以选择花1780元坐飞机去北京、也可以花262元坐火车去北京、还可以花180元坐汽车去北京这三种方式去完成这一趟行程那么这就是一种多分支的情况
    • php循环结构:当条件成立的时候,执行循环体的代码,当条件不成立的时候,跳出循环,执行循环结构后面的代码。 

      • 列如:辣条厂包装辣条,每包里面需要装10根辣条,工人从第一根、第二根、第三根....一直到第十根才能装满一包完成。那么包装辣条这个过程就是一个循环的过程。

2.3.1 php单分支

  • php语句程序执行的流程不超过2个的结构(双分支)
  • 在php程序里面可以使用if...else语句

  • 格式

    if(expr){
        statement1;
    }else{
        statement2;
    }
    
  • 流程图如下图 2.1

    图 2.1 if...else语句的流程图

     

    • 图2.1原理:如果条件为true,就执行操作1,否则就执行操作2。条件:能够判断正确或者错误的表达式。 等同于三元操作符的原理
  • 列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 "平年";
          }
      }
      
    • 运行结果:

      平年
      

2.3.2 多分支

  • 程序执行的流程超过了2个以上的结构(不止2个选择的结构)
  • 多分支结构里面有elseif/else if 和switch 两种结构

2.3.2.1 elseif/else if语句

  • 格式

    if(expr1){
        statement1;
    }elseif(expr2){
        statement2;
    }elseif(expr3){
        statement3;
    }
    ...
    else{
        statement4;
    }
    
  • 流程图如下图 2.2

    图 2.2 elseif/else if语句的流程图

     

    • 图 2.2原理:如果条件1为true,就执行操作1,为false就判断条件2,条件2为true,就执行操作2,为false就判断条件3,条件3为true,就执行操作3,否则就执行操作4。
  • 按规定百分试卷 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
    

2.3.2.2 switch结构

  • 格式

    switch(variable){               
        case value1:        
            statement1;
        break;
        case value2:
            statement2;
        break;
        case value3:
            statement3;
        break;
        ... 
        default:
            default statement;
    }
    
  • 流程图如下图 2.3

    图 2.3 switch语句的流程图

     

    • 图 2.3原理:如果变量等于值1那么就执行代码1,然后break跳出结构,否则判断如果变量值等于值2,那么执行代码2,然后break跳出 如果case值没有符合条件的,那么就执行代码n;
  • 按规定百分试卷 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分之间
    
  • 注意:

    1. 如果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分以下
      
    2. case\default 后面全都是冒号

    3. esleif和switch的比较:

      1. 所有的switch都可以改写成elseif,但是并非所有的elseif都能改写成switch
      2. if运行效率比switch稍微低一点,所以当判断范围值的时候,使用if,当判断的是具体值的时候,使用switch   
      

2.4.1 for循环结构

  • 当条件成立的时候,执行循环体的代码,当条件不成立的时候,跳出循环,执行循环结构后面的代码。

  • 格式

    for(expr1;expr2;expr3){
        statement;
    }
    
  • 流程图如下图 2.4

     

    图 2.4 for语句的流程图

     

    • 图 2.4原理:第一次循环时先无条件给一个默认初始值(expr1),然后判断初始化的值是否符合循环条件2(expr2),如果为真,则执行代码块(statement),再执行循环条件的改变(expr3)获取新的值再进入循环条件2(expr2),如果为真,则执行代码块(statement),再继续获取值(expr3),直到循环条件2(expr2)为false时,退出循环;
  • 计算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/>";
    }
    
  • 运行结果是:

    动态的红包(注每次结果不一样)
    

2.4.2 while循环结构

  • 格式

    expr;  1                
    while(expr 2){      
        statement  4;   
        expr; 3     
    }
    
  • 流程图如图 2.5 for语句的流程图

    图 2.5 while语句的流程图

     

  • 计算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
    

2.4.3 do..while循环结构

  • 格式

    expr1;
    do{
        statement;
        expr2;
    }
    while(expr3);
    
  • 流程图如下图 2.5

    图 2.5 while语句的流程图

     

    • 图 2.5原理:第一次循环时先无条件给一个默认初始值(expr1),然后先执行代码块(statement),根据循环条件的改变(expr2)获取新的值,根据循环条件的判断(expr3),如果结果为true,则继续执行代码块(statement),再根据循环条件的改变(expr2)获取新的值,再根据循环条件的判断(expr3),直到结果为false,跳出循环
  • 注意:先执行代码,然后再判断,而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
    

2.4.4 foreach循环结构

  • Foreach也是一种循环,专门作用于数组 数组章节再给大家详细介绍
  • 格式

    foreach($array as $key=>$value){
        // 针对于$key和value的一些操作
    }
    

2.5 Continue,break,exit的用法

  • 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
    
  • Break:结束本次控制结构,执行后面的代码。参照switch讲解
  • Exit:停止整个脚本的运行,执行到exit的时候停止执行下面的php代码,一般用于php代码调试错误.

2.6、课后小练习

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."&nbsp;";
}

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."&nbsp;";
}
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

本文由欣才IT学院整理发布,未经许可,禁止转载。