0%

流程控制语句、分支、循环

流程控制概述

  • 任何 PHP 脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,甚至一个什么也不做的(空语句)条件语句。语句通常以分号结束。此外,还可以用花括号将一组语句封装成一个语句组。语句组本身可以当作是一行语句。
  • 在任何一门程序设计语言中,都需要支持满足程序结构化所需要的三种基本结构:
    • 顺序结构
    • 分支结构(选择结构)
    • 循环结构

分支结构

单一条件分支结构(if)

当条件表达式的值为真true时,PHP将执行语句组,相反条件表达式的值为假false时,PHP将不执行语句组,忽略语句组执行下面的语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$a=5;
$b=3;
if ($a > $b)
echo "a > b"; //如果变量a的值大于b的值则会输出:a大于b

$x=10;
$y=20;
if($x<$y){ //判断是否x小于y。多条语句需要使用{ }括起来。
$t=$x;
$x=$y;
$y=$t;
}
var_dump($x>$y); //输出:bool(true)
?>

双向条件分支结构(else从句)

if-else 条件判断与 if 条件判断类似,所不同的是,if-else
句的条件表达式值为真true时,会执行 if 的本体语句语句组1
而条件表达式值为假false时,则执行 else 的本体语句语句组2

image

1
2
3
4
5
if(false){  // 真区间
echo 1;
} else { // 假区间
echo 2;
}

多向条件分支结构(else if子句)

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php 
date_default_timezone_set("Etc/GMT-8"); //设置时区,中国大陆采用东八区的时间
echo "当前时间".date("Y-m-d H:i:s",time())." "; //通过date()函数获取当前时间,并输出

$hour = date("H"); //获取服务器时间中当前的小时,作为分时问候的条件
if( $hour < 6 ) { //如果当前时间在6点以前,执行下面的语句块
echo "凌晨好!";
} else if ( $hour < 9 ) { //如果当前时间在6点之后和9点以前,执行下面的语句块
echo "早上好!";
} else if ( $hour < 12 ) { //如果当前时间在9点之后和12点以前,执行下面的语句块
echo "上午好!";
} else if ( $hour < 14 ) { //如果当前时间在12点之后和14点以前,执行下面的语句块
echo "中午好!";
} else if ( $hour < 17 ) { //如果当前时间在14点之后和17点以前,执行下面的语句块
echo "下午好!";
} else if ( $hour < 19 ) { //如果当前时间在17点之后和19点以前,执行下面的语句块
echo "傍晚好!";
} else if ( $hour < 22 ) { //如果当前时间在19点之后和22点以前,执行下面的语句块
echo "晚上好!";
} else { //如果当前时间在22点之后和次日1点以前,执行下面语句块
echo "夜里好!";
}
?>

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

当程序执行碰到switch条件判断时,它会取出键值,然后与语句体中的case所列出的值逐一比较,如果数值不符合,则将数值往下一个case传递,如果数值符合,则执行case中的语句,然后再碰到break语句即跳出switch条件判断,如果所有的值比对都不符合,则会执行default中的语句 。

image

switch语句使用注意事项:

  • switch语句与if语句不同,它仅能判断一种关系:是否恒等
  • switch语句中case子句的常量可以是整型常量、字符型常量、表达式或变量。
  • 在同一个switch中,case子句的常量不能相同,否则第二个值永远无法匹配到。
  • casedefault 子句后面的语句序列允许由多个可执行语句组成,且不必用{ }括起来,也可以为空语句。
  • switch语句中可省略break语句和default子句。但省略后会改变流程。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    date_default_timezone_set("Etc/GMT-8"); //设置时区,中国大陆采用东八区的时间
    $week = date("D"); //获取当前星期几
    switch( $week ) {
    case "Mon": echo "星期一"; break;
    case "Tue": echo "星期二"; break;
    case "Wed": echo "星期三"; break;
    case "Thu": echo "星期四"; break;
    case "Fri": echo "星期五"; break;
    case "Sat": echo "星期六"; break;
    case "Sun": echo "星期日"; break;
    };
    ?>

    巢状条件分支结构

    巢状式条件分支结构就是if语句的嵌套,即指ifelse后面的语句块中又包含if语句。if语句可以无限层地嵌套在其他if语句,这给程序的不同部分的条件执行提供了充分的弹性。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
    $a=88;
    echo "数学成绩:".$a;
    if($a>=60){
    if($a>=70){
    if($a>=90){
    echo "不错喔!!这次数学成绩甲等!!";
    }else{
    echo "还可以...这次数学成绩乙等!!";
    }
    }else{
    echo "勉勉强强及格边缘...这次数学成绩丙等!!";
    }
    }else{
    echo "有待下次努力...数学成绩不及格!!";
    }
    ?>

循环结构

while循环

while循环语句中表达式循环控制语句的结果为真时,程序将反复执行同一段程序:循环体while中的语句或语句序列,直到满足一定的条件表达式的结果为假时后才停止执行该段程序。

image

1
2
3
4
5
6
7
8
9
10
11
<?php
//求1到100的累加。
$i=1;
$sum=0;
while($i<=100)
{
$sum+=$i;
$i++;
}
echo $sum;
?>

do while循环

序会先执行do语句体中的语句循环体,然后再检查表达式循环控制语句的值,如果符合条件式值为真,就再进行do 语句体中的语句,直到条件不符合为止

  • do-while后面必须加上分号作为结束
  • do-whilewhile的最大区别是先执行循环体然后再判断循环的控制条件

示例1:求1-100的累加

1
2
3
4
5
6
7
8
9
<?php	//求1到100的累加。
$i=1;
$sum=0;
do{
$sum+=$i;
$i++;
}while($i<=100);
echo $sum;
?>

示例2:使用while循环嵌套输出表格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<table align="center" border="1" width=600>
<caption><h1>使用while循环嵌套输出表格</h1></caption>
<?php
$out = 0; //外层循环需要计数的累加变量
while( $out < 10 ) { //指定外层循环,并且循环次数为10次
$bgcolor = $out%2 == 0 ? "#FFFFFF" : "#DDDDDD";
echo "<tr bgcolor=".$bgcolor.">"; //执行一次则输出一行并指定背景颜色
$in = 0; //内层循环需要计数的累加变量
while( $in < 10 ) { //指定内层循环,并且循环次数为10次
echo "<td>".($out*10+$in)."</td>"; //执行一次,输出一个单元格
$in++; //内层的计数变量累加
}
echo "</tr>"; //输出行关闭标记
$out++; //外层的计数变量累加
}
?>
</table>
</body>
</html>

image

fro循环

for循环语句中表达式1为循环初始条件表达式2为循环控制条件表达式3为控制变量递增;语句或语句序列为循环体。

image

示例1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<?php
//使用花括号“{}”将代码块括起来,通常代码块为一条时可以不加花括号
for( $i = 1; $i <= 10; $i++ ) {
echo "这是第<b> $i </b>次循环执行输出的结果<br>";
}
$i = 1; //将for语句中第一部分初始化提出来,放到for前面执行,但for语句中的分号要保留
for( ; $i <= 10; $i++ ) {
echo "这是第<b> $i </b>次循环执行输出的结果<br>";
}
$i = 1; //再将第三部分的增量提出来,放到for语句的执行体最后,但也要将分号保留
for( ; $i <= 10; ) {
echo "这是第<b> $i </b>次循环执行输出的结果<br>";
$i++;
}

$i = 1;
for( ; ; ) {
if( $i > 10 )
break;
echo "这是第<b> $i </b>次循环执行输出的结果<br>";
$i++;
}
?>
</body>
</html>

image

特殊流程控制语句

break语句

我们之前在switch条件判断中已经使用过break 关键字,它会使得程序流程离开switch本体中的语句,如果break使用在 forwhiledo-while 循环结构中时,将会使得程序跳出该层循环

continue语句

continue的作用与break有点类似,continue若使用在forwhiledo-while循环结构中,当程序执行至continue 时,之后的语句将直接被略过,而直接执行下一次的循环动作

exit()函数和die()函数

当前的脚本中只要执行到exit语句,而不管它在哪个结构中都会直接退出当前脚本。exit是一个函数,当前使用过的die()函数就是exit()的别名。可以带参数输出一条消息,并退出当前脚本。