0%

[基礎課程] Lesson 2 PHP程式流程控制

一個完整程式的執行通常都是為了解決一個特定的問題,而問題可以被拆解成為步驟,每個步驟都包含一些程式指令,這些指令可能只是一個運算的結果,也可能是一個判斷或邏輯處理的結果。

PHP程式會由檔案的第一行開始順序執行,中間遇到不同的指令可能產生不同的執行步驟變化,這個過程我們稱流程控制。

在PHP中主要的流程控制指令有三類:

  • 選擇結構
  • 重覆結構
  • 巢狀結構

選擇結構

選擇結構會依據某個特定的條件是否成立來決定一個二選一或是多選一的結果。

if…else

if判斷式是最基本的選擇結構,主要是用在二選一的場景中,判斷的依據是條件是否成立,如果成立則會得到一個 true(真) 的結果,如果不成立則會得到一個 false(假) 的結果,程式會根據真和假的狀況去執行不同的程式碼區段

語法格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
if(條件式){  //注意條件式必能返回true 或 false的結果,

//條件式為true時執行的程式碼

}else{

//條件式為false時執行的程式碼
//要注意else並不是必須的,如果沒有加上else區段
//那就表示當條件式為false時,不執行任何程式碼

}


語法範例:

1
2
3
4
5
6
7
8
9
10

$score=75;
if($score>=60){
//判斷式為'真'時執行這個區段的程式碼
echo "及格";
}else{
//判斷式為'假'時執行這個區段的程式碼
echo "不及格";
}

switch…case

多選的結構是由if結構變化而來的,其用法是依據條件的值來做選擇,因此和if不同的是,switch的條件結果必須有明確的值,才能建立選擇的依據;

語法格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
switch(條件公式){ //注意條件公式必須要能產生一個明確的值
case 'A': //注意case 只能放明確的值,不能放公式或條件式

//滿足case 'A' 時執行的程式碼

break; //依需要決定是否要加break;如果不加break;則case 'A' 執行完畢後會接著執行case 'B'
case 'B':
//滿足case 'B' 時執行的程式碼
break;
default:
//條件公式的結果不在case 中時會執行default語句後的程式碼,
//如果不加default,則表示沒有符合的case 時,結束這個switch的執行

}


語法範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

$level="B";

switch($level){
case "A":
echo "表現優良,請繼續保持";
break;
case "B":
echo "值得肯定,還有進步空間";
break;
case "C":
echo "需要更多的練習";
break;
case "D":
echo "需要加強基本功";
break;
default:
echo "是否無心學業?";

}


三元運算子

三元運算子本身除了是運算子也是一種選擇結構

語法格式:

1
2
3
4
5
6
7
8
9

/*
*三元運算子通常使用在只需簡短指定值的場合
*所以儘量不要在程式碼區段做太複雜的程式執行
*三元運算儘量用在回傳並指定值的功能上
*儘量不要在三元運算子中使用巢狀語法
*/
$var=(條件式)?真:假;

語法範例:

1
2
3
4
5
6
7
8
9
$level=($score>=60)?'及格':'不及格';

//以上程式碼相當於
if($score>=60){
$level='及格';
}else{
$level='不及格';
}

重覆結構

重覆結構是為了解決程式運行中需要大量重覆執行的作業,依據重覆的次數明確與否,可以分成幾種類型

for loop

語法格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
*起始值依需求決定,不一定是從0或1開始,
*起始值的作用是決定迴圈次數,所以大多數的狀況下只能指定數字
*遞增或遞減的公式不一定是$i++或$i--,依需求決定
*遞增公式範例 $i=$i+2 每次的迴圈都會讓$i增加2,例:1,3,5....
*遞增公式範例 $i=$i*2+1 每次的迴圈都會讓$i依照公式增加,例:1,3,7,15...
*/

for(起始值;讓迴圈進行的條件式;遞增/減值){

//要重覆執行的程式碼

}

語法範例:

1
2
3
4
5

for($i=0 ; $i<10 ; $i++){
echo $i*10;
}

while / do…while

語法格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
*和for迴圈的最大不同在於while沒有明確的次數,
*while的條件式必須要有能明確結束的語句,否則會形成無窮迴圈
*必要時可以在把中斷的語法寫在程式碼區段中
*/
while(條件式){

//要重覆執行的程式

}

/*
*和while的不同在於do..while不論條件式是否成立都會至少執行一次
*注意do..while後要加上分號(;)
*/

do{

//要重覆執行的程式

}while(條件式);


語法範例:

1
2
3
4
5
6
7
8
$score=10;

while($score<60){
$score=$score+10;
}

echo $score;

foreach

語法格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
*foreach是針對陣列或是集合物件使用的語法
*foreach會將陣列中的元素拆成key和value兩個變數
*如果沒有特別指定,foreach會把陣列中的元素從頭到尾都取出來一次
*/

foreach($array as $key => $value){

//要重覆執行的程式碼

}


語法範例:

1
2
3
4
5
6
7
$score=[60,22,72,10,80];

foreach($scroe as $idx => $val){
echo '第' . $idx . '位同學的成績為' . $val . '<br>';
}


巢狀流程控制

有時問題一旦變得複雜時,單一流程結構不一定能解決問題,這時我們可能會在流程結構中再加上相同或不同的流程結構,這樣的程式狀態就叫做巢狀流程控制。

雖然理論上巢狀結構可以無限層的去執行,但只要巢狀的層級太多,往往也會造成日後維護及閱讀的不方便,因此在使用巢狀結構時,一定要控制好層級不要太多,或是思考別的做法來降低或簡化巢狀結構的複雜度。

1
2
3
4
5
6
7
8
9
10

for($i=0 ; $i<10 ; $i++){
echo $i*10;

if($i>5){
echo "執行一半了...";
}

}

流程結構練習

判斷成績及格學生

  • 給定一個成績數字,判斷是否及格(60)分

分配成績等級

  • 給定一個成績數字,根據成績所在的區間,給定等級
  • 0 ~ 59 => E
  • 60 ~ 69 => D
  • 70 ~ 79 => C
  • 80 ~ 89 => B
  • 90 ~ 100 => A

依據學生成績等級給予評價

  • 根據學生不同的成績等級在網頁上印出不同的文字評價

閏年判斷,給定一個西元年份,判斷是否為閏年

  • 地球對太陽的公轉一年的真實時間大約是365天5小時48分46秒,因此以365天定為一年 的狀況下,每年會多出近六小時的時間,所以每隔四年設置一個閏年來消除這多出來的一天。
  • 公元年分除以4不可整除,為平年。
  • 公元年分除以4可整除但除以100不可整除,為閏年。
  • 公元年分除以100可整除但除以400不可整除,為平年。

使用for迴圈來產生以下的數列

  • 1,3,5,7,9……n
  • 10,20,30,40,50,60……n
  • 3,5,7,11,13,17……97

九九乘法表

  • 以表格排列的九九乘法表

  • 以交叉計算結果呈現的九九乘法表

尋找字元(使用while)

  • 給定一個字串句子
  • 給定一個單字或字母
  • 尋找相符的內容
  • 印出尋找到的單字或字母所在句子中的位置

以 * 符號為基礎在網頁上排列出下列圖形:

  • 直角三角型
  • 倒直角三角型
  • 正三角型
  • 菱型
  • 矩形
  • 內含對角線的矩形