iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 7
1

在PHP中,程式碼通常由上到下一行一行執行的,而流程控制指令則會改變程式執行的順序。
今天要來介紹的流程控制指令主要分為分支和迴圈兩種機制:
分支指的是像if、else、switch等,從字面上解釋就是:若XXX為真,則執行程式碼A;否則執行程式碼B。
而迴圈簡單來說就是在條件符合的情況下,重複執行某段程式碼。常用的loop指令有:while、for、do while等。
大部分的分支和迴圈結構都是由布林值(boolean)判斷式來控制的,也就是true或false。
但在進入流程控制之前,要先分清楚'='、'=='這兩者的差別。

  • '=':單一個等號是賦值的意思,將等號右邊的值賦予左邊的變數,例如:
$num = 10; //將$num設為10
  • '==':兩個等號則是用於比較左右兩邊的值是否相等,例如:
$num1 = 10;
$num2 = 9;

$num1==$num2 為false。
而在PHP中,'!'是not的意思,若要判斷等號左右兩邊是否"不相等",則會寫成:

$num1 != $num2

分支結構:if、else、switch判斷式

舉個簡單的例子:若今天下雨,我們就待在家看電影;若沒下雨,我們就去打球;
我們把今天的天氣當成一個變數的話,那上面這段寫成程式碼就會變成:

$rainny = true;
if($rainny){ //若今天下雨
    echo "Let's stay home and watch a movie.\n"; //我們就待在家看電影
}else{ //若沒下雨
    echo "Let's go play basketball.\n"; //我們就去打球
}
//Output:Let's stay home and watch a movie.

那麼當$rainny為真時,Output就會是:Let's stay home and watch a movie.
反之,若將$rainny設為false則會執行else底下的程式碼:Let's go play basketball.
非常簡單吧!
而當情況不只為真假兩種,而是有多種可能時,可以用多個else if,或用switch來表達。
假設今天天氣可能會有四種情況:
1.若今天出太陽,我們就去打球
2.若今天下雨,我們就在家看電影
3.若今天是陰天,我們就去逛街
4.若今天下雪,我們就去滑雪
用多個else if表達則是:

if(weather=='sunny'){ //若今天出太陽
    echo "Let's go play basketball.\n"; //我們就去打球
}else if(weather=='rainny'){  //若今天下雨
    echo "Let's stay home and watch a movie.\n"; //我們就待在家看電影
}else if(weather=='windy'){ //若今天是陰天
    echo "Let's go shopping.\n"; //我們就去逛街
}else{  //若今天下雪
    echo "Let's go skiing.\n";  //我們就去滑雪
}

不過為了維護程式碼的整潔與可讀性,當碰到多種情況需要做判斷時,建議用switch來表示:

$weather = 'windy';
switch ($weather) {
	case 'sunny':
        echo "Let's go play basketball.\n"; 
        break;
    case 'rainny':
        echo "Let's stay home and watch a movie.\n";
        break;
    case 'windy':
        echo "Let's go shopping.\n";
        break;
    default:  //若expression的值未出現在上面的case中,則執行這段程式碼
        echo "Let's go skiing.\n"; 
        break;
}
//Output:Let's go shopping.

記得case的下的程式碼最後加上一個break跳出這段程式碼,否則它會繼續執行接下來的所有case。

迴圈結構:while、do while、for迴圈

迴圈顧名思義,就是在符合判斷式的情況下會重複執行指定的程式區塊,一直到條件不符合為止才會跳出迴圈。
若今天要算出20以內有幾個偶數,我們可以這樣寫:

$n = 0; //$n表示偶數個數
for($i=1;$i<21;$i++){ //i從1開始,在還沒超過20之前(小於21以前)都執行一次下面的程式碼,每次循環後都+1
    if($i%2 == 0){ //若i是2的倍數(%為取餘數的運算符號)
         $n++;
    }
}
echo "There are $n evens within 20.\n"; //迴圈結束,顯示出20以內有2的倍數總數
//Output:There are 10 evens within 20.

while的寫法則如下:

$n = 0;
$i = 1;
while($i<21){
    if($i%2 == 0){ 
         $n++;
    }
    $i++; //這行要記得,否則這個while迴圈將會變成無限迴圈
}
echo "There are $n evens within 20.\n";
//Output:There are 10 evens within 20.

執行結果跟上面的for迴圈也會是一樣的。
do while則是會先執行迴圈中的程式,執行完才判斷條件,若符合條件就會再次執行。

$n = 0;
$i = 1;
do{
    if($i%2 == 0){ 
         $n++;
    }
    $i++;
}while($i<21); //這行結尾記得要加上';'
echo "There are $n evens within 20.\n";
//Output:There are 10 evens within 20.

不過一般來說,while和for用法的差別在於,while可以用在當你不確定迴圈會跑幾次的時候,for則無法。

跳出迴圈指令

break

break:跳出流程控制區塊,就如前面在switch所示。

continue

break是直接跳出迴圈區塊,而continue則是不執行接下來在區塊內的程式碼,直接跳回區塊的開頭再執行一次。
例如:

for($i=0;$i<10;$i++){
        if($i%2==0){
            continue;
        }
        echo "$i isn't the product of 2\n";
}
/*Output:
1 isn't the product of 2
3 isn't the product of 2
5 isn't the product of 2
7 isn't the product of 2
9 isn't the product of 2 */

當$i為偶數時,則會跳過下面這行echo "$i isn't the product of 2\n";回到區塊開頭繼續執行。

goto

goto則可以在離開控制區塊後,直接跳到某個標記處開始往下執行,用法如下:

for($i=1;$i<11;$i++){
    if($i==3){
        goto three;
    }
}
one: echo "one ";
two: echo "two ";
three: echo "three ";
four: echo "four ";
five: echo "five ";
//Output:three four five

今天就先到這,下回見!


上一篇
Day 6 PHP基礎語法(一):Hello world與基本資料型態
下一篇
Day 8 PHP基礎語法(三):陣列、foreach
系列文
後端基礎PHP+Mysql & Laravel 30日養成計畫36

尚未有邦友留言

立即登入留言