[TOC] # 上节回顾 * PHP中变量的数据类型都有哪些? * 常量的声明和应用? * PHP中的运算符号都有哪些? # 分支结构 > 任何 PHP 脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,甚至一个什么也不做的(空语句)条件语句。语句通常以分号结束。此外,还可以用花括号将一组语句封装成一个语句组。语句组本身可以当作是一行语句。本章讲述了各种语句类型。 在任何一门程序设计语言中,都需要支持满足程序结构化所需要的三种基本结构: * 顺序结构 * 分支结构(选择结构) * 循环结构 顺序结构:在程序结构中,最基本的就是顺序结构。程序会按照自上而下的顺序执行。 *** ###### 单一条件分支结构(if) 基本格式: ``` if(条件表达式){ 语句组; //语句组为单条语句时可省略“{ }”。 } ``` ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/4630996-ef8e42265f92b5ea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 当条件表达式的值为真(true)时,PHP将执行语句组,相反条件表达式的值为假(false)时,PHP将不执行语句组,忽略语句组执行下面的语句。 ``` <?php 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(条件表达式){ 语句组1 }else{ 语句组2 } ``` ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/4630996-55a04ec93ceb1b87.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) if-else 条件判断与 if 条件判断类似,所不同的是,if-else 语句的条件表达式值为真(true)时,会执行 if 的本体语句(语句组1),而条件表达式值为假(false)时,则执行 else 的本体语句(语句组2)。 ###### 多向条件分支结构(elseif子句) 格式如下 ``` if(条件表达式1){ 语句块1 }elseif(条件表达式2){ 语句块2 ... ... }elseif(条件表达式n){ 语句块n }else{ 语句块n+1 } ``` ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/4630996-e8fb89c0279bb44e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ``` <?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 "凌晨好!"; } elseif ( $hour < 9 ) { //如果当前时间在6点之后和9点以前,执行下面的语句块 echo "早上好!"; } elseif ( $hour < 12 ) { //如果当前时间在9点之后和12点以前,执行下面的语句块 echo "上午好!"; } elseif ( $hour < 14 ) { //如果当前时间在12点之后和14点以前,执行下面的语句块 echo "中午好!"; } elseif ( $hour < 17 ) { //如果当前时间在14点之后和17点以前,执行下面的语句块 echo "下午好!"; } elseif ( $hour < 19 ) { //如果当前时间在17点之后和19点以前,执行下面的语句块 echo "傍晚好!"; } elseif ( $hour < 22 ) { //如果当前时间在19点之后和22点以前,执行下面的语句块 echo "晚上好!"; } else { //如果当前时间在22点之后和次日1点以前,执行下面语句块 echo "夜里好!"; } ``` ###### 多向条件分支结构(switch语句) 语句语法: ``` switch(表达式){ case 值1: 语句序列1; break; case 值2: 语句序列2; break; … default: 语句序列 n; break; } ``` ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/4630996-7afd3799b5e43d4e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 当程序执行碰到switch条件判断时,它会取出键值,然后与语句体中的case所列出的值逐一比较,如果数值不符合,则将数值往下一个case传递,如果数值符合,则执行case中的语句,然后再碰到break语句即跳出switch条件判断,如果所有的值比对都不符合,则会执行default中的语句 。 > switch语句使用注意事项: * switch语句与if语句不同,它仅能判断一种关系:是否恒等。 * switch语句中case子句的常量可以是整型常量、字符型常量、表达式或变量。 * 在同一个switch中,case子句的常量不能相同,否则第二个值永远无法匹配到。 * case 和 default 子句后面的语句序列允许由多个可执行语句组成,且不必用“{ }”括起来,也可以为空语句。 * switch语句中可省略break语句和default子句。但省略后会改变流程。 ``` <?php $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; } switch( $i ) { //条件表达式是一个变量$i case 2: //和值2匹配时,没有break,将控制转移到下一个case中的语句 case 3: //和值3匹配时,执行下面的语句块 echo "\$i和值2或3任一个匹配"; break; //退出switch语句 case 4: //和值为3匹配上时,执行下面的语句块 echo "\$i和值4匹配时,才会执行"; break; //退出switch语句 default: //匹配任何和其他case都不匹配的情况, 要放在最后一个case之后 echo "\$i没有匹配的值时,才会执行"; } ``` ###### 巢状条件分支结构 语法: ``` if(表达式1){ if(表达式2){ .. .. .. }else{ .. .. .. } }else{ if(表达式3){ … } } ``` 巢状式条件分支结构就是if语句的嵌套,即指if或else后面的语句块中又包含if语句。if语句可以无限层地嵌套在其他if语句,这给程序的不同部分的条件执行提供了充分的弹性。 巢状式if..else流程控制使用范例: ``` <?php $a=88; echo "数学成绩: $A <p>"; if($a>=60){ if($a>=70){ if($a>=90){ echo "不错喔!!这次数学成绩甲等!!"; }else{ echo "还可以...这次数学成绩乙等!!"; } }else{ echo "勉勉强强及格边缘...这次数学成绩丙等!!"; } }else{ echo "有待下次努力...数学成绩不及格!!"; } ?> ``` # 循环结构 ###### while语句 while循环语法: ``` while(表达式){ 语句或语句序列 ... ... } ``` 当while循环语句中表达式(循环控制语句)的结果为真时,程序将反复执行同一段程序:循环体( while中的语句或语句序列),直到满足一定的条件(表达式的结果为假时)后才停止执行该段程序。 ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/4630996-2aef001b1019f808.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ``` 实例: <?php //求1到100的累加。 $i=1; $sum=0; while($i<=100) { $sum+=$i; $i++; } echo $sum; ?> ``` > 尝试一下吧 ``` <html> <head><title>使用while循环嵌套输出表格</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> ``` ###### do...while循环 基本格式: ``` do{ 语句或语句序列 ... ... }while(表达式); ``` 程序会先执行 do 语句体中的语句(循环体),然后再检查表达式(循环控制语句)的值,如果符合条件式(值为真),就再进行 do 语句体中的语句,直到条件不符合为止 ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/4630996-e4d67697df5f8188.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) > 注意: do-while 后面必须加上分号作为结束 do-while与while的最大区别是先执行循环体然后再判断循环的控制条件 ``` <?php //求1到100的累加。 $i=1; $sum=0; do{ $sum+=$i; $i++; }while($i<=100); echo $sum; ?> ``` ###### for循环 基本格式: ``` for(表达式1;表达式2;表达式3) { 语句或语句序列; } ``` for循环语句中表达式1为循环初始条件;表达式2为循环控制条件;表达式3为控制变量递增;语句或语句序列为循环体。 ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/4630996-fabcccd37f0a5245.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ``` <?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++; } ``` ###### 特殊的流程控制语句 * break 我们之前在 switch 条件判断中已经使用过 break 关键字,它会使得程序流程离开 switch 本体中的语句,如果 break 使用在 for、while 或 do-while 循环结构中时,将会使得程序离开该层循环。 * continue continue 的作用与 break 有点类似,continue 若使用在 for、while 或 do-while循环结构中,当程序执行至 continue 时,之后的语句将直接被略过,而直接执行下一次的循环动作。 3. exit 当前的脚本中只要执行到exit语句,而不管它在哪个结构中都会直接退出当前脚本。exit是一个函数,当前使用过的die( )函数就是exit( )的别名。可以带参数输出一条消息,并退出当前脚本。 > Have a try 1. 四种9X9乘法表(for循环) 2. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。(while循环)