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

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

在任何一門程序設(shè)計語言中枪汪,都需要支持滿足程序結(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)怔昨。程序會按照自上而下的順序執(zhí)行雀久。

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

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

基本格式:

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

當(dāng)條件表達式的值為真(true)時趁舀,PHP將執(zhí)行語句組赖捌,相反條件表達式的值為假(false)時,PHP將不執(zhí)行語句組矮烹,忽略語句組執(zhí)行下面的語句越庇。

<?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)
?>
雙向條件分支結(jié)構(gòu)(else從句)

格式如下

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

if-else 條件判斷與 if 條件判斷類似卤唉,所不同的是,if-else 語句的條件表達式值為真(true)時仁期,會執(zhí)行 if 的本體語句(語句組1)桑驱,而條件表達式值為假(false)時竭恬,則執(zhí)行 else 的本體語句(語句組2)。

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

格式如下

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

語句語法:

    switch(表達式){
        case  值1:
             語句序列1;      break道媚; 
        case  值2:
             語句序列2扁掸;      break;
         …
        default:
             語句序列 n最域;         break谴分;
     }
Paste_Image.png

當(dāng)程序執(zhí)行碰到switch條件判斷時,它會取出鍵值镀脂,然后與語句體中的case所列出的值逐一比較牺蹄,如果數(shù)值不符合,則將數(shù)值往下一個case傳遞薄翅,如果數(shù)值符合沙兰,則執(zhí)行case中的語句,然后再碰到break語句即跳出switch條件判斷翘魄,如果所有的值比對都不符合鼎天,則會執(zhí)行default中的語句 。

switch語句使用注意事項:
switch語句與if語句不同暑竟,它僅能判斷一種關(guān)系:是否恒等斋射。
switch語句中case子句的常量可以是整型常量、字符型常量但荤、表達式或變量罗岖。
在同一個switch中,case子句的常量不能相同腹躁,否則第二個值永遠無法匹配到桑包。
case 和 default 子句后面的語句序列允許由多個可執(zhí)行語句組成,且不必用“{ }”括起來潜慎,也可以為空語句捡多。
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,將控制轉(zhuǎn)移到下一個case中的語句
        case 3:                                 //和值3匹配時倒信,執(zhí)行下面的語句塊
            echo "\$i和值2或3任一個匹配"; 
            break;                              //退出switch語句
        case 4:                                 //和值為3匹配上時科贬,執(zhí)行下面的語句塊
            echo "\$i和值4匹配時,才會執(zhí)行";      
            break;                              //退出switch語句
        default:                                //匹配任何和其他case都不匹配的情況, 要放在最后一個case之后
            echo "\$i沒有匹配的值時鳖悠,才會執(zhí)行";     
    }
巢狀條件分支結(jié)構(gòu)

語法:

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

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

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

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

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

while語句

while循環(huán)語法:

  while(表達式){
        語句或語句序列
        ... ...
    }

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

Paste_Image.png
實例:
<?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)需要計數(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)需要計數(shù)的累加變量
                    while( $in < 10 ) {                     //指定內(nèi)層循環(huán)反砌,并且循環(huán)次數(shù)為10次
                        echo "<td>".($out*10+$in)."</td>";  //執(zhí)行一次,輸出一個單元格
                        $in++;                              //內(nèi)層的計數(shù)變量累加
                    }
                    echo "</tr>";                           //輸出行關(guān)閉標(biāo)記
                    $out++;                                 //外層的計數(shù)變量累加
                }
            ?>
        </table>
    </body>
</html>
do...while循環(huán)

基本格式:

     do{
        語句或語句序列
        ... ...
   }while(表達式)萌朱;

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

Paste_Image.png

注意:
do-while 后面必須加上分號作為結(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(表達式1;表達式2;表達式3)
    {
        語句或語句序列;
     }

for循環(huán)語句中表達式1為循環(huán)初始條件冒晰;表達式2為循環(huán)控制條件同衣;表達式3為控制變量遞增;語句或語句序列為循環(huán)體壶运。

Paste_Image.png
<?php
    //使用花括號“{}”將代碼塊括起來耐齐,通常代碼塊為一條時可以不加花括號
    for( $i = 1;  $i <= 10;  $i++ ) {
        echo "這是第<b> $i </b>次循環(huán)執(zhí)行輸出的結(jié)果<br>";  
    }
    $i = 1; //將for語句中第一部分初始化提出來,放到for前面執(zhí)行蒋情,但for語句中的分號要保留
    for( ;  $i <= 10;  $i++ ) {
        echo "這是第<b> $i </b>次循環(huán)執(zhí)行輸出的結(jié)果<br>";  
    }
    $i = 1; //再將第三部分的增量提出來埠况,放到for語句的執(zhí)行體最后,但也要將分號保留
    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++;   
    }
特殊的流程控制語句
  • break
    我們之前在 switch 條件判斷中已經(jīng)使用過 break 關(guān)鍵字棵癣,它會使得程序流程離開 switch 本體中的語句辕翰,如果 break 使用在 for、while 或 do-while 循環(huán)結(jié)構(gòu)中時狈谊,將會使得程序離開該層循環(huán)喜命。
  • continue
    continue 的作用與 break 有點類似沟沙,continue 若使用在 for、while 或 do-while循環(huán)結(jié)構(gòu)中壁榕,當(dāng)程序執(zhí)行至 continue 時矛紫,之后的語句將直接被略過,而直接執(zhí)行下一次的循環(huán)動作牌里。
  1. exit
    當(dāng)前的腳本中只要執(zhí)行到exit語句颊咬,而不管它在哪個結(jié)構(gòu)中都會直接退出當(dāng)前腳本。exit是一個函數(shù)牡辽,當(dāng)前使用過的die( )函數(shù)就是exit( )的別名喳篇。可以帶參數(shù)輸出一條消息态辛,并退出當(dāng)前腳本麸澜。

Have a try

  1. 四種9X9乘法表(for循環(huán))
  2. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數(shù)字因妙。例如2+22+222+2222+22222(此時共有5個數(shù)相加)痰憎,幾個數(shù)相加由鍵盤控制。(while循環(huán))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攀涵,一起剝皮案震驚了整個濱河市铣耘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌以故,老刑警劉巖蜗细,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異怒详,居然都是意外死亡炉媒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門昆烁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吊骤,“玉大人,你說我怎么就攤上這事静尼“追郏” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵鼠渺,是天一觀的道長鸭巴。 經(jīng)常有香客問我,道長拦盹,這世上最難降的妖魔是什么鹃祖? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮普舆,結(jié)果婚禮上恬口,老公的妹妹穿的比我還像新娘校读。我一直安慰自己,他們只是感情好祖能,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布地熄。 她就那樣靜靜地躺著,像睡著了一般芯杀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雅潭,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天揭厚,我揣著相機與錄音,去河邊找鬼扶供。 笑死筛圆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的椿浓。 我是一名探鬼主播太援,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扳碍!你這毒婦竟也來了提岔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤笋敞,失蹤者是張志新(化名)和其女友劉穎碱蒙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夯巷,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡赛惩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了趁餐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喷兼。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖后雷,靈堂內(nèi)的尸體忽然破棺而出季惯,到底是詐尸還是另有隱情,我是刑警寧澤喷面,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布星瘾,位于F島的核電站,受9級特大地震影響惧辈,放射性物質(zhì)發(fā)生泄漏琳状。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一盒齿、第九天 我趴在偏房一處隱蔽的房頂上張望念逞。 院中可真熱鬧困食,春花似錦、人聲如沸翎承。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叨咖。三九已至瘩例,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甸各,已是汗流浹背垛贤。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趣倾,地道東北人聘惦。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像儒恋,于是被迫代替她去往敵國和親善绎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

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

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