3.PHP流程控制結(jié)構(gòu)

任何 PHP 腳本都是由一系列語(yǔ)句構(gòu)成的。一條語(yǔ)句可以是一個(gè)賦值語(yǔ)句,一個(gè)函數(shù)調(diào)用,一個(gè)循環(huán),甚至一個(gè)什么也不做的(空語(yǔ)句)條件語(yǔ)句。語(yǔ)句通常以分號(hào)結(jié)束。此外,還可以用花括號(hào)將一組語(yǔ)句封裝成一個(gè)語(yǔ)句組。語(yǔ)句組本身可以當(dāng)作是一行語(yǔ)句。本章講述了各種語(yǔ)句類(lèi)型。

在任何一門(mén)程序設(shè)計(jì)語(yǔ)言中,都需要支持滿足程序結(jié)構(gòu)化所需要的三種基本結(jié)構(gòu):

  • 順序結(jié)構(gòu)
  • 分支結(jié)構(gòu)(選擇結(jié)構(gòu))
  • 循環(huán)結(jié)構(gòu)

順序結(jié)構(gòu):在程序結(jié)構(gòu)中,最基本的就是順序結(jié)構(gòu)。程序會(huì)按照自上而下的順序執(zhí)行。

分支結(jié)構(gòu)

單一條件分支結(jié)構(gòu)(if)

基本格式:

      if(條件表達(dá)式){
           語(yǔ)句組; 
           //語(yǔ)句組為單條語(yǔ)句時(shí)可省略“{ }”。
       }
Paste_Image.png

當(dāng)條件表達(dá)式的值為真(true)時(shí),PHP將執(zhí)行語(yǔ)句組,相反條件表達(dá)式的值為假(false)時(shí),PHP將不執(zhí)行語(yǔ)句組,忽略語(yǔ)句組執(zhí)行下面的語(yǔ)句。

<?php
    if ($a > $b)
        echo "a 大于 b"; //如果變量a的值大于b的值則會(huì)輸出:a大于b
    $x=10;
    $y=20;
    if($x<$y){               //判斷是否x小于y。多條語(yǔ)句需要使用{ }括起來(lái)。
         $t=$x;
         $x=$y;
         $y=$t;
    }
    
    var_dump($x>$y);  //輸出:bool(true)
?>
雙向條件分支結(jié)構(gòu)(else從句)

格式如下

    if(條件表達(dá)式){
        語(yǔ)句組1
    }else{  
        語(yǔ)句組2    
    }
Paste_Image.png

if-else 條件判斷與 if 條件判斷類(lèi)似,所不同的是,if-else 語(yǔ)句的條件表達(dá)式值為真(true)時(shí),會(huì)執(zhí)行 if 的本體語(yǔ)句(語(yǔ)句組1),而條件表達(dá)式值為假(false)時(shí),則執(zhí)行 else 的本體語(yǔ)句(語(yǔ)句組2)。

多向條件分支結(jié)構(gòu)(elseif子句)

格式如下

    if(條件表達(dá)式1){
        語(yǔ)句塊1
    }elseif(條件表達(dá)式2){    
        語(yǔ)句塊2    
    ... ...     
    }elseif(條件表達(dá)式n){
         語(yǔ)句塊n
     }else{
        語(yǔ)句塊n+1
     }
Paste_Image.png
<?php 
    date_default_timezone_set("Etc/GMT-8");       //設(shè)置時(shí)區(qū),中國(guó)大陸采用東八區(qū)的時(shí)間
    echo "當(dāng)前時(shí)間".date("Y-m-d H:i:s",time())." "; //通過(guò)date()函數(shù)獲取當(dāng)前時(shí)間,并輸出
    
    $hour = date("H");                 //獲取服務(wù)器時(shí)間中當(dāng)前的小時(shí),作為分時(shí)問(wèn)候的條件
    if( $hour < 6 ) {                  //如果當(dāng)前時(shí)間在6點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
        echo "凌晨好!";
    } elseif ( $hour < 9 ) {           //如果當(dāng)前時(shí)間在6點(diǎn)之后和9點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
        echo "早上好!";
    } elseif ( $hour < 12 ) {         //如果當(dāng)前時(shí)間在9點(diǎn)之后和12點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
        echo "上午好!";
    } elseif ( $hour < 14 ) {         //如果當(dāng)前時(shí)間在12點(diǎn)之后和14點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
        echo "中午好!";
    } elseif ( $hour < 17 ) {          //如果當(dāng)前時(shí)間在14點(diǎn)之后和17點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
        echo "下午好!";
    } elseif ( $hour < 19 ) {          //如果當(dāng)前時(shí)間在17點(diǎn)之后和19點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
        echo "傍晚好!";
    } elseif ( $hour < 22 ) {          //如果當(dāng)前時(shí)間在19點(diǎn)之后和22點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
        echo "晚上好!";
    } else {                           //如果當(dāng)前時(shí)間在22點(diǎn)之后和次日1點(diǎn)以前,執(zhí)行下面語(yǔ)句塊
        echo "夜里好!";
    }
多向條件分支結(jié)構(gòu)(switch語(yǔ)句)

語(yǔ)句語(yǔ)法:

    switch(表達(dá)式){
        case  值1:
             語(yǔ)句序列1;      break; 
        case  值2:
             語(yǔ)句序列2;      break;
         …
        default:
             語(yǔ)句序列 n;         break;
     }
Paste_Image.png

當(dāng)程序執(zhí)行碰到switch條件判斷時(shí),它會(huì)取出鍵值,然后與語(yǔ)句體中的case所列出的值逐一比較,如果數(shù)值不符合,則將數(shù)值往下一個(gè)case傳遞,如果數(shù)值符合,則執(zhí)行case中的語(yǔ)句,然后再碰到break語(yǔ)句即跳出switch條件判斷,如果所有的值比對(duì)都不符合,則會(huì)執(zhí)行default中的語(yǔ)句 。

switch語(yǔ)句使用注意事項(xiàng):
switch語(yǔ)句與if語(yǔ)句不同,它僅能判斷一種關(guān)系:是否恒等。
switch語(yǔ)句中case子句的常量可以是整型常量、字符型常量、表達(dá)式或變量。
在同一個(gè)switch中,case子句的常量不能相同,否則第二個(gè)值永遠(yuǎn)無(wú)法匹配到。
case 和 default 子句后面的語(yǔ)句序列允許由多個(gè)可執(zhí)行語(yǔ)句組成,且不必用“{ }”括起來(lái),也可以為空語(yǔ)句。
switch語(yǔ)句中可省略break語(yǔ)句和default子句。但省略后會(huì)改變流程。

<?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 ) {                             //條件表達(dá)式是一個(gè)變量$i
        case 2:                                 //和值2匹配時(shí),沒(méi)有break,將控制轉(zhuǎn)移到下一個(gè)case中的語(yǔ)句
        case 3:                                 //和值3匹配時(shí),執(zhí)行下面的語(yǔ)句塊
            echo "\$i和值2或3任一個(gè)匹配"; 
            break;                              //退出switch語(yǔ)句
        case 4:                                 //和值為3匹配上時(shí),執(zhí)行下面的語(yǔ)句塊
            echo "\$i和值4匹配時(shí),才會(huì)執(zhí)行";      
            break;                              //退出switch語(yǔ)句
        default:                                //匹配任何和其他case都不匹配的情況, 要放在最后一個(gè)case之后
            echo "\$i沒(méi)有匹配的值時(shí),才會(huì)執(zhí)行";     
    }
巢狀條件分支結(jié)構(gòu)

語(yǔ)法:

if(表達(dá)式1){
   if(表達(dá)式2){
       .. .. ..
     }else{
     .. .. ..
     }
}else{
   if(表達(dá)式3){?   …
     }
}

巢狀式條件分支結(jié)構(gòu)就是if語(yǔ)句的嵌套,即指if或else后面的語(yǔ)句塊中又包含if語(yǔ)句。if語(yǔ)句可以無(wú)限層地嵌套在其他if語(yǔ)句,這給程序的不同部分的條件執(zhí)行提供了充分的彈性。

巢狀式if..else流程控制使用范例:

<?php
$a=88;
echo "數(shù)學(xué)成績(jī):  $A <p>";
if($a>=60){
    if($a>=70){
          if($a>=90){
            echo "不錯(cuò)喔!!這次數(shù)學(xué)成績(jī)甲等!!";
          }else{    
            echo "還可以...這次數(shù)學(xué)成績(jī)乙等!!"; 
          }
     }else{
      echo "勉勉強(qiáng)強(qiáng)及格邊緣...這次數(shù)學(xué)成績(jī)丙等!!";
     }
 }else{
     echo "有待下次努力...數(shù)學(xué)成績(jī)不及格!!";
 }
?>

循環(huán)結(jié)構(gòu)

while語(yǔ)句

while循環(huán)語(yǔ)法:

  while(表達(dá)式){
        語(yǔ)句或語(yǔ)句序列
        ... ...
    }

當(dāng)while循環(huán)語(yǔ)句中表達(dá)式(循環(huán)控制語(yǔ)句)的結(jié)果為真時(shí),程序?qū)⒎磸?fù)執(zhí)行同一段程序:循環(huán)體( while中的語(yǔ)句或語(yǔ)句序列),直到滿足一定的條件(表達(dá)式的結(jié)果為假時(shí))后才停止執(zhí)行該段程序。

Paste_Image.png
實(shí)例:
<?php
    //求1到100的累加。
    $i=1;   
    $sum=0;
    while($i<=100)
    {
        $sum+=$i;
        $i++;
    }
    echo $sum;
?>

嘗試一下吧

Paste_Image.png
<html>
    <head><title>使用while循環(huán)嵌套輸出表格</title></head>
    <body>
        <table align="center" border="1" width=600>
            <caption><h1>使用while循環(huán)嵌套輸出表格</h1></caption>
            <?php
                $out = 0;                                   //外層循環(huán)需要計(jì)數(shù)的累加變量
                while( $out < 10 ) {                        //指定外層循環(huán),并且循環(huán)次數(shù)為10次
                    $bgcolor = $out%2 == 0 ? "#FFFFFF" : "#DDDDDD";
                    echo “<tr bgcolor=”.$bgcolor.“>”;       //執(zhí)行一次則輸出一行并指定背景顏色
                    $in = 0;                                //內(nèi)層循環(huán)需要計(jì)數(shù)的累加變量
                    while( $in < 10 ) {                     //指定內(nèi)層循環(huán),并且循環(huán)次數(shù)為10次
                        echo "<td>".($out*10+$in)."</td>";  //執(zhí)行一次,輸出一個(gè)單元格
                        $in++;                              //內(nèi)層的計(jì)數(shù)變量累加
                    }
                    echo "</tr>";                           //輸出行關(guān)閉標(biāo)記
                    $out++;                                 //外層的計(jì)數(shù)變量累加
                }
            ?>
        </table>
    </body>
</html>
do...while循環(huán)

基本格式:

     do{
        語(yǔ)句或語(yǔ)句序列
        ... ...
   }while(表達(dá)式);

程序會(huì)先執(zhí)行 do 語(yǔ)句體中的語(yǔ)句(循環(huán)體),然后再檢查表達(dá)式(循環(huán)控制語(yǔ)句)的值,如果符合條件式(值為真),就再進(jìn)行 do 語(yǔ)句體中的語(yǔ)句,直到條件不符合為止

Paste_Image.png

注意:
do-while 后面必須加上分號(hào)作為結(jié)束
do-while與while的最大區(qū)別是先執(zhí)行循環(huán)體然后再判斷循環(huán)的控制條件

<?php   //求1到100的累加。
    $i=1;   ?$sum=0;
    do{
           $sum+=$i;
          $i++;
    }while($i<=100);
    echo $sum;
?>
for循環(huán)

基本格式:

    for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
    {
        語(yǔ)句或語(yǔ)句序列;
     }

for循環(huán)語(yǔ)句中表達(dá)式1為循環(huán)初始條件;表達(dá)式2為循環(huán)控制條件;表達(dá)式3為控制變量遞增;語(yǔ)句或語(yǔ)句序列為循環(huán)體。

Paste_Image.png
<?php
    //使用花括號(hào)“{}”將代碼塊括起來(lái),通常代碼塊為一條時(shí)可以不加花括號(hào)
    for( $i = 1;  $i <= 10;  $i++ ) {
        echo "這是第<b> $i </b>次循環(huán)執(zhí)行輸出的結(jié)果<br>";  
    }
    $i = 1; //將for語(yǔ)句中第一部分初始化提出來(lái),放到for前面執(zhí)行,但for語(yǔ)句中的分號(hào)要保留
    for( ;  $i <= 10;  $i++ ) {
        echo "這是第<b> $i </b>次循環(huán)執(zhí)行輸出的結(jié)果<br>";  
    }
    $i = 1; //再將第三部分的增量提出來(lái),放到for語(yǔ)句的執(zhí)行體最后,但也要將分號(hào)保留
    for( ;  $i <= 10; ) {
        echo "這是第<b> $i </b>次循環(huán)執(zhí)行輸出的結(jié)果<br>";
        $i++;   
    }

    $i = 1;
    for( ; ; ) {
        if( $i > 10 )
            break;
        echo "這是第<b> $i </b>次循環(huán)執(zhí)行輸出的結(jié)果<br>";
        $i++;   
    }
特殊的流程控制語(yǔ)句
  • break
    我們之前在 switch 條件判斷中已經(jīng)使用過(guò) break 關(guān)鍵字,它會(huì)使得程序流程離開(kāi) switch 本體中的語(yǔ)句,如果 break 使用在 for、while 或 do-while 循環(huán)結(jié)構(gòu)中時(shí),將會(huì)使得程序離開(kāi)該層循環(huán)。
  • continue
    continue 的作用與 break 有點(diǎn)類(lèi)似,continue 若使用在 for、while 或 do-while循環(huán)結(jié)構(gòu)中,當(dāng)程序執(zhí)行至 continue 時(shí),之后的語(yǔ)句將直接被略過(guò),而直接執(zhí)行下一次的循環(huán)動(dòng)作。
  1. exit
    當(dāng)前的腳本中只要執(zhí)行到exit語(yǔ)句,而不管它在哪個(gè)結(jié)構(gòu)中都會(huì)直接退出當(dāng)前腳本。exit是一個(gè)函數(shù),當(dāng)前使用過(guò)的die( )函數(shù)就是exit( )的別名。可以帶參數(shù)輸出一條消息,并退出當(dāng)前腳本。

Have a try

  1. 四種9X9乘法表(for循環(huán))
  2. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個(gè)數(shù)字。例如2+22+222+2222+22222(此時(shí)共有5個(gè)數(shù)相加),幾個(gè)數(shù)相加由鍵盤(pán)控制。(while循環(huán))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Swift 提供了類(lèi)似 C 語(yǔ)言的流程控制結(jié)構(gòu),包括可以多次執(zhí)行任務(wù)的for和while循環(huán),基于特定條件選擇執(zhí)行...
    窮人家的孩紙閱讀 721評(píng)論 1 1
  • [The Swift Programming Language 中文版]本頁(yè)包含內(nèi)容: Swift提供了多種流程控...
    風(fēng)林山火閱讀 588評(píng)論 0 0
  • Swift提供了多種控制流聲明。包括while循環(huán)來(lái)多次執(zhí)行一個(gè)任務(wù);if,guard和switch聲明來(lái)根據(jù)確定...
    BoomLee閱讀 1,984評(píng)論 0 3
  • 本章將會(huì)介紹 控制流For-In 循環(huán)While 循環(huán)If 條件語(yǔ)句Switch 語(yǔ)句控制轉(zhuǎn)移語(yǔ)句 continu...
    寒橋閱讀 744評(píng)論 0 0
  • 已經(jīng)立秋了。 初秋的夜晚,蟬鳴還是不消停,“伏天兒、伏天兒”地嘶喊著,白天還好,一到了傍晚,那蟬鳴一浪接著一浪,更...
    幻珥閱讀 885評(píng)論 0 0