流程控制,就是研究程序的走向。

流程控制概述

三大流程结构:

顺序结构:

程序运行的自然状态,就是从前往后(从上到下)运行程序。

分支结构:

程序运行过程中,根据判断条件的不同结果(true或false),执行不同的分支(其他分支不再执行)。

循环结构:

程序运行过程中,根据判断条件的不同结果(true或false),决定是再次执行还是不再执行。

流程图常用图形符号:

流程图
流程图

if语句

有如下几种常见的if语句(不同的分支数量):

形式1:单分支

形式:

<?php 
if ( /*条件判断*/ ) {

    // 如果条件满足,就执行这里
    
    }
 ?>

流程图:见下

形式2:双分支

形式:

<?php 
if ( /*条件判断*/ ) {

    // 如果条件满足,就执行这里

    } else {
    
    // 如果条件不满足,就执行这里
    
    }
 ?>

流程图:见下

形式3:多分枝

形式:

<?php 
if ( /*条件判断1*/ ) {

    // 分支1;
    
    } elseif ( /*条件判断2*/ ) {
    
    // 分支2;
    
    } elseif ( /*条件判断3*/ ) {
    
    // 分支3;
    
    } else {  //......前面的elseif分支,可以若干个(0个以上)
    
    // 最后的else分支,可以没有!
    
}
 ?>

流程图:

流程控制-分支结构-if示意图1
流程控制-分支结构-if示意图1
流程控制-分支结构-if示意图2
流程控制-分支结构-if示意图2
流程控制-分支结构-if示意图3
流程控制-分支结构-if示意图3

if语句综合形式

语法:

<?php 
if ( /*条件1*/ ) {

    // 分支1

} elseif( /*条件2*/ ) {

    // 分支2:;

} elseif( /*条件3*/ ) {

    //分支3;

} else {

// else分支; //前面没有一个条件满足的时候,就执行本分支

}
 ?>

说明:

  1. 上述,黄色部分,是if语句“必不可少”的部分。
  2. 上述,灰色部分是elseif分支,可以重复若干次,也可以没有。
  3. 上述,茶绿色部分是else分支,可以没有。

综合案例:在一个form表单中输入一个分数(0-100之间),程序可以给该分数进行“评语”,评语包括:优秀,良好,中等,及格,不及格。实现代码:

<form action="" method="post">
    输入分数:<input type="text" name="score">(0-100之间)
    <br><input type="submit" value="做评语">
</form>
<h1>
<?php 
    if(!empty( $_POST['score'] ))//如果不为空
    {
        $sc = $_POST['score'];
        if( $sc >= 90 )
        {
            echo "优秀";
        }
        elseif($sc >= 80)
        {
            echo "良好";
        }
        //。。。更多elseif分支,以及else情况
        //注意:
        //还要考虑分数不在这个范围的情况
        //还要考虑不是分数(比如字母)的情况
    }
    elseif(isset($_POST['score']) && $_POST['score'] == "0")
    {
        echo "不及格";
    }
    else{
        echo "请输入分数";
    }
?>
</h1>

分支结构之switch分支语句(重点)

语法:

<?php 

switch ( /*一个变量数据或表达式结果\$v1*/ )
{
    case "值1":
        // 分支语句1;
        break;        
    case "值2":
        // 分支语句2;
        break;  
    case "值3":
        // 分支语句3;
        break;  
    default:
        // 默认分支语句
        break;
}

?>

说明:

  1. 上述“值1,值2,。。。”可以是各种标量类型,也可以是表达式——因为最终它也是一个值。
  2. 用于进行测试的数据变量$v1跟后续的各个值,只能进行“相等比较”(==)。
  3. 从上述第2条角度来说,其实际上不如if灵活。

注意:

当某个分支满足条件并执行该分支后,如果该分支中没有break语句,此时,程序的流程会“直接进入”后一个分支继续执行,直到碰到break才会结束switch。

流程图:

流程控制-分支结构-switch示意图
流程控制-分支结构-switch示意图

示例:给出任意年份和月份,输出该月的天数。

<?php 

//给出任意年份和月份,输出该月的天数。
$year = 2008;
$month = 22;
switch( $month )
{
    case 1:
        echo "{$year}年{$month}月的天数为31天";
        break;
    case 3:
        echo "{$year}年{$month}月的天数为31天";
        break;
    case 5:
        echo "{$year}年{$month}月的天数为31天";
        break;
    case 7:
        echo "{$year}年{$month}月的天数为31天";
        break;
    case 8:
        echo "{$year}年{$month}月的天数为31天";
        break;
    case 10:
        echo "{$year}年{$month}月的天数为31天";
        break;
    case 12:
        echo "{$year}年{$month}月的天数为31天";
        break;
    case 4:
        echo "{$year}年{$month}月的天数为30天";
        break;
    case 6:
        echo "{$year}年{$month}月的天数为30天";
        break;
    case 9:
        echo "{$year}年{$month}月的天数为30天";
        break;
    case 11:
        echo "{$year}年{$month}月的天数为30天";
        break;
    case 2:
        //如果是闰年
        if( $year % 4 == 0 && $year % 100 != 0  || $year % 400 == 0)
        {
            echo "{$year}年{$month}月的天数为29天";
        }
        else
        {
            echo "{$year}年{$month}月的天数为28天";
        }
        
        break;
    default:
        echo "没有该月份";
}

 ?>

优化版:

<?php 

//给出任意年份和月份,输出该月的天数。
$year = 2008;
$month = 22;
switch( $month )
{
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        echo "{$year}年{$month}月的天数为31天";
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        echo "{$year}年{$month}月的天数为30天";
        break;
    case 2:
        //如果是闰年
        if( $year % 4 == 0 && $year % 100 != 0  || $year % 400 == 0)
        {
            echo "{$year}年{$month}月的天数为29天";
        }
        else
        {
            echo "{$year}年{$month}月的天数为28天";
        }
        
        break;
    default:
        echo "没有该月份";
}

 ?>

循环结构之while循环语句

循环的含义:就是通过某种语法结构,对某段代码可以“反复执行”。

while循环语法:

<?php 

//循环三要素:
//循环变量的初始化
$n = 10;
while( $n > 5 )    //循环变量的判断(就是条件)
{
    echo "<br>彩票中奖!";
    //循环变量的改变
    $n--;
}

 ?>

说明:

循环一开始就进行条件判断:

  1. 如果成立:则执行循环体,而后会自动回到循环开始位置继续进行条件判断,如此反复;
  2. 如果不成立:则退出循环,执行后续语句。

流程图:

流程控制-循环结构-while循环示意图
流程控制-循环结构-while循环示意图

案例:求7到17的和。

<?php 

$n = 0;
$sum = 0;

while ($n <= 17)
{
    $sum += $n;
    $n++;
}

echo "1~17的和为:{$sum}";

 ?>

求1~100之间能被3整除的数的和:

<?php 

$n = 1;
$sum = 0;

while ($n <= 100)
{
    if ($n % 3 == 0)
    {
        $sum += $n;
    }
    $n++;
}

echo "1~100之间能被3整除的数字的和为:{$sum}";

 ?>

循环结构之do while循环语句

do while循环语法:

见案例

说明:

先执行一次循环体,然后进行条件判断:

如果成立:则继续回去执行循环体,而后再次进行条件判断,如此反复;

如果不成立:则退出循环,执行后续语句。

流程图:

流程控制-循环结构-dowhile循环示意图
流程控制-循环结构-dowhile循环示意图

案例:求7到177之间能被7整除的数的和。

<?php 

$n = 7;
$sum = 0;
$num = 0;

do
{
    if ($n % 7 === 0)
    {
        $sum += $n;
        $num++;
    }
    $n++;
} while ($n < 177);

$averageVlaue = $sum / $num;

echo "7~177之间所有可以被7整除的数的和为:{$sum},共有{$num}个数字,平均值为:{$averageVlaue}"; //7~177之间所有可以被7整除的数的和为:2275,共有25个数字,平均值为:91

 ?>

循环结构之for循环语句(重点/难点)

for循环语法:

for(循环变量初始化; 循环条件判断; 循环变量的改变){

。。。。。。。。循环体语句块;

//这里可以有多条语句

//是可以反复执行的部分

}

说明:

1,执行流程如下图所示

for循环执行
for循环执行

2,此语句结构是将循环的3个要素都集中在一起写的形式,比较紧凑,容易控制,最常用。

3,循环变量初始化语句1只执行一次,所以真正的正常循环,是在“2->4->3”之间进行。

典型流程图:

流程控制-循环结构-for循环
流程控制-循环结构-for循环

案例1:求1-100之间能被7整除的数的和。

$sum = 0;

for ($i = 1; $i <= 100; $i++)
{
    if ($i % 7 == 0)
    {
        $sum += $i;
    }
}

echo "1~100之间可以被7整除的数字之和为:{$sum}"; // 1~100之间可以被7整除的数字之和为:735

案例2:输出1-100之间能被3整除但不能被5整除的偶数。

$sum = 0;

for ($i = 1; $i <= 100; $i++)
{
    if ($i % 3 == 0 && $i % 5 != 0 && $i % 2 == 0)
    {
        $sum += $i;
    }
}

echo "1-100之间能被3整除但不能被5整除的偶数之和为:{$sum}"; // 1~100之间可以被7整除的数字之和为:1-100之间能被3整除但不能被5整除的偶数之和为:636

 ?>

案例3:输出1-100之间的数,并且要求:能被3整除的使用“三”代替,能被5整除的使用“五”代替,能同时被两者整除的用“三五”代替。

for ($i = 1; $i <= 100; $i++)
{
    if ($i % 3 == 0 || $i % 5 == 0)
    {
        if ($i % 3 == 0 && $i % 5 == 0)
        {
            echo "三五<br>";
        }
        elseif ($i % 3 == 0)
        {
            echo "三<br>";
        }
        elseif ($i % 5 == 0)
        {
            echo "五<br>";
        }
    }
    else
    {
        echo "{$i}<br>";
    }
}

多重循环及案例

概念:

多重循环就是循环里面由出现循环的代码。

其基本执行流程,其实仍然是循环的基本逻辑,只是循环的时候要注意:外层循环执行每一次,里层循环就会完整执行循环的“所有次”(一个完整循环的过程)。

案例1:

for ($i = 1; $i <= 4; $i++)
{
    for ($j = 1; $j <= 8; $j++)
    {
        if ($j == 1)
        {
            echo "{$i}";
        }
        else
        {
            echo "{$j}";
        }
    }
    echo "<br>";
}

输出如下形式的数字到页面上:

1 2 3 4 5 6 7 8;

2 2 3 4 5 6 7 8;

3 2 3 4 5 6 7 8;

4 2 3 4 5 6 7 8;

案例2:

<?php 
    echo "<table border='1' width=400 height=100>";
    $n = 0;
    for($i = 1; $i <= 4; $i++)
    {
        echo "<tr>";//输出行的开始标签
        for($k = 1; $k <= 6; $k++)
        {
            $n++;
            echo "<td>$n</td>";
        }
        echo "</tr>";//输出行的结束标签
    }

 ?>
</table>
<?php 
    echo $n;
 ?>

或者:

<?php 
    echo "<table border='1' width=400 height=100>";
    // $n = 0;
    for($i = 1; $i <= 4; $i++)
    {
        echo "<tr>";//输出行的开始标签
        for($k = 1; $k <= 6; $k++)
        {
            $n = $k + ($i-1)*6;
            echo "<td>$n</td>";
        }
        echo "</tr>";//输出行的结束标签
    }

 ?>
</table>
<?php 
    echo $n;
 ?>

输出如下表格:

123456
789101112
131415161718
192021222324

案例3:

实现如下所示99乘法口诀表。

echo "<table border='1' width=1000 height=100>";

for ($i = 1; $i <= 9; $i++)
{
    echo "<tr>";

    for ($k = 1; $k <= $i; $k++)
    {
        $result = $i*$k;
        $demo = $result < 10 ? $result . " " : $result;
        echo "<td>{$k} × {$i} = ",$demo," </td>";
    }


    echo "</tr><br>";
}

echo "</table>";

案例4:有红、白、黑三种球若干个,其中红、白球共25个,白、黑球共31个,红、黑球共28个,求这三种球各多少个?

课间案例:公鸡(cock)5元一只,母鸡(hen)3元一只,小鸡(chick)1元3只,100元买了100只鸡,问各多少?

穷举法:

$cockValue = 5;
$henValue = 3;
$chickValue = 0.5;
$countNum = 0;

for ($chickNum = 0; $chickNum <= 100; $chickNum++)
{
    for ($henNum = 0; $henNum <= 100; $henNum++)
    {
        for ($cockNum = 0; $cockNum <= 100; $cockNum++)
        {
            if (($chickNum + $henNum + $cockNum) == 100 && ($chickNum * $chickValue + $henNum * $henValue + $cockNum * $cockValue) == 100)
            {
                echo "公鸡{$cockNum},母鸡{$henNum},小鸡{$chickNum}。<br>";
            }
            $countNum++;
        }
    }
}

echo "共进行{$countNum}次运算."; //共进行1030301次运算.

优化版-01:

$cockValue = 5;
$henValue = 3;
$chickValue = 0.5;
$countNum = 0;

for ($chickNum = 0; $chickNum <= 100 / 5; $chickNum++)
{
    for ($henNum = 0; $henNum <= 100 / 3; $henNum++)
    {
        for ($cockNum = 0; $cockNum <= 100 / 0.5; $cockNum++)
        {
            if (($chickNum + $henNum + $cockNum) == 100 && ($chickNum * $chickValue + $henNum * $henValue + $cockNum * $cockValue) == 100)
            {
                echo "公鸡{$cockNum},母鸡{$henNum},小鸡{$chickNum}。<br>";
            }
            $countNum++;
        }
    }
}

echo "共进行{$countNum}次运算."; // 共进行143514次运算.

终极版:

$cockValue = 5;
$henValue = 3;
$chickValue = 0.5;
$countNum = 0;

for ($cockNum = 0; $cockNum <= 100 / 5; $cockNum++)
{
    for ($henNum = 0; $henNum <= 100 / 3; $henNum++)
    {
        $chickNum = 100 - $henNum - $cockNum; // 在公鸡、母鸡的数量确确定之后,小鸡的数量不需要再进行循环,已经为定值。
        if (($chickNum + $henNum + $cockNum) == 100 && ($chickNum * $chickValue + $henNum * $henValue + $cockNum * $cockValue) == 100)
        {
            echo "公鸡{$cockNum},母鸡{$henNum},小鸡{$chickNum}。<br>";
        }
        $countNum++;
    }
}

echo "共进行{$countNum}次运算."; // 共进行714次运算.

无敌版:

$cockValue = 5;
$henValue = 3;
$chickValue = 0.5;
$countNum = 0;

for ($cockNum = 0; $cockNum <= 100 / 5; $cockNum++)
{
    for ($henNum = 0; $henNum <= (100 - $cockNum * 5) / 3; $henNum++) //考虑到买母鸡的钱一定是用的买公鸡剩下的。
    {
        $chickNum = 100 - $henNum - $cockNum;
        if (($chickNum + $henNum + $cockNum) == 100 && ($chickNum * $chickValue + $henNum * $henValue + $cockNum * $cockValue) == 100)
        {
            echo "公鸡{$cockNum},母鸡{$henNum},小鸡{$chickNum}。<br>";
        }
        $countNum++;
    }
}

echo "共进行{$countNum}次运算."; // 共进行364次运算.

循环的中断

循环是按给定的条件,只要条件满足就会继续执行循环体的一种语法形式。

但,我们也可以在循环过程中(循环体内),人为将循环中断。

有两种中断循环的方式:

continue中断:

含义:中断当前正在进行的循环体(即后续语句不再执行),继续下一次循环要执行的语句。

语法形式:

continue [$n]; //表示是要中断第几层的循环,继续该层循环的下一次。

//其中$n可以省略,如果省略,表示1,就是中断当前层的循环。

break中断:

含义:停止(跳出)当前正在进行的循环(即完全终止循环),去执行该循环之后的语句。

语法形式:

break [$n]; //表示是要中断几层循环。

//其中$n可以省略,如果省略,表示1,就是中断当前循环

他们都适用于3种循环。

案例演示:

从1-10(含1和10)进行循环并输出该数字,并要求能被3整除就不输出,能被9整除就终止循环。

最后再输出循环循环变量的值。