PHP 7从入门到精通(视频教学版)
上QQ阅读APP看书,第一时间看更新

4.4 流程控制

流程控制也叫控制结构,在一个应用中用来定义执行程序流程。它决定了某个程序段是否会被执行和执行多少次。

PHP中的控制语句分为3类:顺序控制语句、条件控制语句和循环控制语句。其中,顺序控制语句是从上到下依次执行的,这种结构没有分支和循环,是PHP程序中最简单的结构。下面主要讲述条件控制语句和循环控制语句。

4.4.1 条件控制结构

条件控制语句中包含两个主要的语句,一个是if语句,一个是switch语句。

1.单一条件分支结构(if语句)

if语句是最为常见的条件控制语句,格式为:

    if(条件判断语句){
              命令执行语句;
    }

这种形式只是对一个条件进行判断。如果条件成立,就执行命令语句,否则不执行。

if语句的流程控制图如图4-9所示。

图4-9 if语句流程控制图

【例4.9】(实例文件:ch04\4.9.php)

    <? php
        $num = rand(1,100);                         //使用rand()函数生成一个随机数
        if ($num % 2 ! = 0){                        //判断变量$num是否为奇数
            echo "\$num = $num";                       //如果为奇数,输出表达式和说明文字
            echo "<br />$num是奇数。";
        }
    ?>

运行后刷新页面,结果如图4-10所示。

图4-10 程序运行结果

【案例分析】

(1)此实例首先使用rand()函数随机生成一个整数$num,然后判断这个随机整数是不是奇数,若是,则输出上述结果,若不是,则不输出任何内容,所以如果页面内容显示为空,就刷新页面。

(2)rand() 函数返回随机整数,语法格式如下:

    rand(min, max)

此函数主要是返回min和max之间的一个随机整数。如果没有提供可选参数min和max,则rand() 返回0到RAND_MAX之间的伪随机整数。

2.双向条件分支结构(if…else语句)

如果是非此即彼的条件判断,可以使用if…else语句。它的格式为:

    if(条件判断语句){
          命令执行语句A;
    }else{
          命令执行语句B;
    }

这种结构形式首先判断条件是否为真,如果为真,就执行命令语句A,否则执行命令语句B。

if…else语句程序控制流程图如图4-11所示。

图4-11 if…else语句控制流程图

【例4.10】(实例文件:ch04\4.10.php)

    <html>
    <? php
    $d=date("D");               //定义时间变量
    if ($d=="Fri")               //判断时间变量是否等于周五
      echo "今天是周五哦!";
    else
      echo "可惜今天不是周五!";
    ?>

运行后结果如图4-12所示。

图4-12 程序运行结果

3.多向条件分支结构(elseif语句)

在条件控制结构中,有时会出现多种选择,此时可以使用elseif语句。它的语法格式为:

    if(条件判断语句){
          命令执行语句;
    }elseif(条件判断语句){
          命令执行语句;
    }…
     else{
          命令执行语句;
    }…

elseif语句程序控制流程图如图4-13所示。

图4-13 elseif语句控制流程图

【例4.11】(实例文件:ch04\4.11.php)

    <? php
        $score = 85;                                   //设置成绩变量$score
        if ($score >= 0 and $score <= 60){            //判断成绩变量是否在0~60之间
            echo "您的成绩为差";                      //如果是,说明成绩为差
          }elseif($score > 60 and $score <= 80){ //否则判断成绩变量是否在61~80之间
            echo "您的成绩为中等";                   //如果是,说明成绩为中等
        }else{                                      //如果两个判断都是false,则输出默认值
            echo "您的成绩为优等";                       //说明成绩为优等
          }
    ?>

运行后结果如图4-14所示。

图4-14 程序运行结果

4.多向条件分支结构(switch语句)

switch语句的结构给出不同情况下可能执行的程序块,条件满足哪个程序块,就执行哪个语句。它的语法格式为:

    switch(条件判断语句){
            case可能判断结果a:
                  命令执行语句;
            break;
            case可能判断结果b:
                  命令执行语句;
            break;
            …
            default:
                  命令执行语句;
    }

其中,若“条件判断语句”的结果符合某个“可能判断结果”,就执行其对应的“命令执行语句”。如果都不符合,则执行default对应的默认项的“命令执行语句”。

switch语句的流程控制图如图4-15所示。

图4-15 switch语句控制流程图

【例4.12】(实例文件:ch04\4.12.php)

    <? php
        $x=5;           //定义变量$x
        switch ($x)      //判断$x与1~5之间的关系
        {
        case 1:
          echo "数值为 1";
          break;
        case 2:
          echo "数值为2";
          break;
        case 3:
          echo "数值为3";
          break;
        case 4:
          echo "数值为4";
          break;
        case 5:
          echo "数值为5";
          break;
        default:
          echo "数值不在1到5之间";
          }
    ?>

运行后结果如图4-16所示。

图4-16 程序运行结果

4.4.2 循环控制结构

循环控制语句主要包括3种,即while循环、do…while循环和for循环。while循环在代码运行的开始检查表述的真假;而do…while循环则在代码运行的末尾检查表述的真假,即do…while循环至少要运行一遍。

1. while循环语句

while循环的结构为:

    while(条件判断语句){
        命令执行语句;
    }

其中,当“条件判断语句”为true时,执行后面的“命令执行语句”,然后返回到条件表达式继续进行判断,直到表达式的值为假才能跳出循环,执行后面的语句。

while循环语句的流程控制图如图4-17所示。

图4-17 while语句控制流程图

【例4.13】(实例文件:ch04\4.13.php)

    <? php
        $num = 1;                  //定义变量$num
        $str = "20以内的奇数为:";  //定义变量$str
        while($num <=20){          //判断$num是否小于或等于20
            if($num % 2! = 0){     //判断$num是否为奇数,为奇数则输出,否则做加一操作
                $str .= $num." ";
            }
            $num++;
        }
        echo $str;
    ?>

运行后结果如图4-18所示。

图4-18 程序运行结果

本实例主要实现20以内的奇数输出。从1~20依次判断是否为奇数,如果是,则输出;如果不是,则继续下一次的循环。

2. do…while循环语句

do…while循环的结构为:

    do{
      命令执行语句;
    }while(条件判断语句)

先执行do后面的“命令执行语句”,其中的变量会随着命令的执行发生变化。当此变量通过while后的“条件判断语句”判断为false时,停止执行“命令执行语句”。

do…while循环语句的流程控制图如图4-19所示。

图4-19 do…while循环语句控制流程图

【例4.14】(实例文件:ch04\4.14.php)

        <? php
        $aa = 0;                                             //声明一个整数变量$aa
        while($aa ! = 0){                                      //使用while循环输出
            echo "不会被执行的内容";                        //这句话不会被输出
        }
        do{                                                 //使用do…while循环输出
            echo "被执行的内容";                             //这句话会被输出
        }while($aa ! = 0);
    ?>

运行后结果如图4-20所示。从结果可以看出,while语句和do…while语句有很大的区别。

图4-20 程序运行结果

3. for循环语句

for循环的结构为:

    for(expr1; expr2; expr3)
    {
      执行命令语句
     }

其中expr1为条件的初始值,expr2为判断的最终值,通常都使用比较表达式或逻辑表达式充当判断的条件,执行完命令语句后,再执行expr3。

for循环语句的流程控制图如图4-21所示。

图4-21 for循环语句控制流程图

【例4.15】(实例文件:ch04\4.15.php)

    <? php
    for($i=0; $i<4; $i++){               //使用for循环输出
      echo "for语句的功能非常强大<br/>";
     }
    ?>

运行结果如图4-22所示,从中可以看出命令语句执行了4次。

图4-22 程序运行结果

4. foreach循环语句

foreach语句是常用的一种循环语句,经常被用来遍历数组元素。它的格式为:

    foreach(数组as数组元素){
          对数组元素的操作命令;
    }

可以根据数组的情况分为两种,即不包含键值的数组和包含键值的数组。

不包含键值的:

    foreach(数组as数组元素值){
          对数组元素的操作命令;
    }

包含键值的:

    foreach(数组as键值 => 数组元素值){
          对数组元素的操作命令;
    }

每进行一次循环,当前数组元素的值就会被赋值给数组元素值变量,数组指针会逐一移动,直到遍历结束为止。

【例4.16】(实例文件:ch04\4.16.php)

    <? php
      $arr=array("one", "two", "three");
      foreach ($arr as $value)    //使用foreach循环输出
      {
          echo "数组值: " . $value . "<br />";
      }
    ?>

运行结果如图4-23所示,从中可以看出命令语句执行了3次。

图4-23 程序运行结果

5.流程控制的另一种书写格式

在一个含有多条件、多循环的语句中,包含多个“{}”,查看起来比较烦琐。流程控制语言的另外一种书写方式是以“:”来代替左边的大括号,使用endif; 、endwhile、endfor、endforeach;和endswitch;来替代右边的大括号,这种描述程序结构的可读性比较强。常见的格式如下。

条件控制语句中的if语句:

    if(条件判断语句):
        命令执行语句;
    elseif(条件判断语句):
        命令执行语句;
    elseif(条件判断语句):
        命令执行语句;
    …
    else:
        命令执行语句;
    endif;

条件控制语句中的switch语句:

    switch(条件判断语句):
        case  可能结果a:
            命令执行语句;
        case  可能结果b:
            命令执行语句;
        …
        default:
            命令执行语句;
    endswitch;

循环控制语句中的while循环:

    while(条件判断语句):
      命令执行语句
    endwhile;

循环控制语句中的do…while循环:

    do
      命令执行语句
    while(条件判断语句);

循环控制语句中的for循环:

    for(起始表述;为真的布尔表述;增幅表述):
      命令执行语句
    endfor;

【例4.17】(实例文件:ch04\4.17.php)

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>杨辉三角</title>
    </head>
    <body>
    <? php
        $mixnum = 1;
        $maxnum = 10;
        $tmparr[][] = array();
        $tmparr[0][0] = 1;
        for($i = 1; $i < $maxnum; $i++):
            for($j = 0; $j <= $i; $j++):
                if($j == 0 or $j == $i):
                    $tmparr[$i][$j] = 1;
                        else:
                    $tmparr[$i][$j] = $tmparr[$i -1][$j -1] + $tmparr[$i -1][$j];
                endif;
            endfor;
        endfor;
        foreach($tmparr as $value):
            foreach($value as $vl)
                echo $vl.' ';
            echo '<p>';
        endforeach;
    ?>
    </body>
    </html>

运行结果如图4-24所示。从效果图可以看出,该代码使用新的书写格式实现了杨辉三角的排列输出。

图4-24 程序运行结果

6.使用break/continue语句跳出循环

break关键字用来跳出(也就是终止)循环控制语句和条件控制语句中switch语句的执行。例如:

    <? php
    $n = 0;
    while (++$n) {
        switch ($n) {
        case 1:
          echo "case one";
          break ;
        case 2:
          echo "case two";
          break 2;
        default:
          echo "case three";
          break 1;
        }
    }
    ?>

在这段程序中,while循环控制语句里面包含一个switch流程控制语句。在程序执行到break语句时,break会终止执行switch语句,或者是switch和while语句。其中,在“case 1”下的break语句跳出switch语句“。case 2”下的break 2语句跳出switch语句和包含switch的while语句。“default”下的break 1语句和“case 1”下的break语句一样,只是跳出switch语句。其中,break后带的数字参数是指break要跳出的控制语句结构的层数。

使用continue关键字的作用是,跳开当前的循环迭代项,直接进入到下一个循环迭代项,继续执行程序。下面通过一个实例说明此关键字作用。

【例4.18】(实例文件:ch04\4.18.php)

    <? php
      $n = 0;
      while ($n++ < 6) {   //使用while循环输出
          if ($n == 2){
              continue;
          }
          echo $n."<br />";
      }
    ?>

运行结果如图4-25所示。

图4-25 程序运行结果

其中,continue关键字在当n等于2的时候跳出本次循环,并且直接进入到下一个循环迭代项,即n等于3。另外,continue关键字和break关键字一样,都可以在后面直接跟一个数字参数,用来表示跳开循环的结构层数。“continue”和“continue 1”相同,“continue 2”表示跳开所在循环和上一级循环的当前迭代项。