PHP7实践指南:O2O网站与App后台开发
上QQ阅读APP看书,第一时间看更新

3.2 循环控制语句

循环控制语句是在满足一定条件的情况下反复执行某一个操作。PHP中提供4种循环控制语句,分别是while、do while、for和foreach。

3.2.1 while循环

while循环语句语法的格式如下:

        while(expr){
        statement
        }

当expr的值为true时,就执行嵌套的statement语句,expr表达式的值在每次开始循环时检查,所以即使这个值在循环语句中改变了,语句也不会停止执行,直到本次循环结束。有时候如果while表达式的值一开始就是false,那么循环语句一次都不会执行。示例如下:

        <? php
        $i=1;
        while ($i<=10){
          echo$i++;
        }
        ?>

执行代码的打印结果是:

          12345678910

3.2.2 do while循环

do while和while都是循环语句,主要区别是使用do while循环的语句会先执行do{}语句块中的代码,然后判断while()中的条件真假,从而决定是否继续循环;而while循环是先判断循环条件的真假,再决定是否循环执行{}里的代码。因此,do while循环的语句保证会执行一次(表达式的真值在每次循环结束后检查), while循环的语句就不一定(表达式真值在循环开始时检查,如果一开始为false,那么整个循环立即终止)。

do while语句的语法格式如下:

        do {
        statement
        } while(expr)

示例如下:

        <? php
        $i=0;
        do{
          echo$i;
        }while ($i>0);
        ?>

以上循环正好运行一次,因为经过第一次循环后,检查表达式的真值时,其值为false($i不大于0),导致循环终止。另一个关于do while的示例如下:

        <? php
        $i = 0;
        do {

          $i++;
          echo$i;
        }while ($i<10);
        ?>

以上代码的运行结果是:

          12345678910

3.2.3 for循环

for循环的语法格式如下:

        for ( expr 1; expr2 ; expr3){
        statement
        }

说明:第一个表达式expr1先执行一次,接着执行statement中的代码块,之后执行表达式expr3,然后判断表达式expr2条件真假,若为真,则继续执行statement中的代码块,然后循环执行expr3,再判断expr2真假,如此循环下去,直到expr2为假时终止循环。

示例如下:

        <? php
        for ($i=1;$i<10;$i++){
            echo$i;
        }
        ?>

执行以上代码的结果为:

          123456789

在for循环中,expr2表达式可以为空,也可以为多个表达式。如果是多个表达式,每个表达式之间用逗号分隔,所有表达式都会被计算,但是只取最后一个的结果。如果expr2为空,就表示无限循环,此时可在statement中加入判断语句,当满足条件时,用break语句结束循环。例如:

        <? php
        for ($i=1, $j=1;$i<10, $j<5;$i++, $j++){
            echo$i;
        }
        echo "<br/>";
        for ($i=1; ;$i++){
            if ($i>10){
              break;
            }

            echo$i;
        }
        ?>

上述代码执行结果如下:

          1234
          12345678910

3.2.4 foreach循环

foreach循环是遍历数组时常用的方法,foreach仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量或者未初始化的变量将发出错误信息。foreach有以下两种语法格式:

格式1:

        foreach (array_expression as$value){
            statement
        }


        
格式2: foreach (array_expression as$key=>$value){ statement }

第一种格式遍历array_expression数组时,每次循环将数组的值赋给$value;第二种遍历不仅将数组值赋给$value,还将键名赋给$key。示例如下:

        <? php
        $array=[0, 1, 2];
        foreach ($array as$val)
        {
            echo "值是:" .$val ;
            echo "<br/>";
            //var_dump(current($array));
        }
        foreach ($array as$key=>$value){
            echo "键名是:" .$key . "值是:" .$value;
            echo "<br/>";
        }
        ?>

执行以上代码打印的结果是:

          值是:0
          值是:1
          值是:2
          键名是:0值是:0
          键名是:1值是:1
          键名是:2值是:2

在PHP 5版本中,当foreach开始循环执行时,每次数组内部指针都会自动向后移动一个单元,但是在PHP 7中却不是这样。如下代码在PHP 5和PHP 7中的执行结果会有所不同。

        <? php
        $array=[0, 1, 2];
        foreach ($array as$val)
        {
            var_dump(current($array));
        }
        ?>

在PHP 5中,将会打印出int(0) int(1) int(2)的结果,但在PHP 7中结果为int(0) int(0) int(0)。

在PHP 7中,按照值进行循环时,foreach是对数组的复制操作,在循环过程中对数组的修改不会影响循环行为,但在PHP 5中却会有影响。

        <? php
        $array=[0, 1, 2];
        //$ref=&$array;//Necessary to trigger the old behavior
        foreach ($array as$val){
            var_dump($val);
            unset($array[1]);
        }
        ?>

在PHP 7中将会打印int(0) int(1) int(2),但在PHP 5中的打印结果却是int(0) int(2)。

在PHP 7中引用循环时对数组的修改会影响循环,在PHP 5中则不会改变。

示例如下:

        <? php
        $array=[0];
        foreach ($array as&$val){
            var_dump($val);
            $array[1]=1;
            $array[2]=2;
        }
        ?>

在PHP 7中的运行结果是int(0) int(1) int(2),在PHP 5中的运行结果却是int(0)。