【PHP】14. Switch-case 條件判斷
【PHP】14. Switch-case 條件判斷
此文章也有影片介紹,可以搭配影片一起學習!
01. Switch-case條件判斷 (所屬課程)
之前我們學到了 if..else if..else的用法,可以同時進行多種條件判斷。
$number = 0;
if ($number == 0)
echo "0";
else if($number == 1)
echo "1";
else if($number == 2)
echo "2";
else if($number == 3)
echo "3";
else
echo "default";
?>
輸出結果:
但如果要分析的東西越來越多時,程式碼就會越來越長,如果又使用大括號,不但造成視覺上的混雜也容易打錯。因此我們可以利用另一個語法 - switch case,讓程式碼更精簡與可讀性更強。
雖然 switch case 在某些程式語言上面並不等同於if..else if..else,但大致上的用法是一致的。
switch case的寫法
輸出結果:
在switch case裡,程式碼會由上往下一行一行跑,如果case的值與條件的值一致,則會執行指定的指令。
執行完畢遇到break(中斷),就會跳出switch判斷式(switch case裡後面的程式碼都不會被執行)。
如果所有的case的值都不符合條件的值,可以在最後設定default,顯示提示內容,類似if..else if..else中的else。
例如將上面的$number = 1改成 $number = 4,因為所有的case的值都沒有4,所以會跳到default,印出default。
$number = 4;
switch ( $number ) {
case 0:
echo "0";
break;
case 1:
echo "1";
break;
case 2:
echo "2";
break;
default:
echo "default";
break;
}
?>
輸出結果:
1. case後要空一格
2. 和if..else if..else不同,中間的指令可以不只一行(如上面echo可以不只一行)
3. 即使不小心沒有對齊,PHP還是可以正常執行(但最好還是整理整齊比較好啦^^)
關於break
你可能會注意到switch case裡面有一個break,如果我們把break拿掉的話,程式會如何執行?
$number = 0;
switch ( $number ) {
case 0:
echo "0";
echo "1";
echo "<br>";
case 1:
echo "Hi hi<br/>";
}
?>
輸出結果:
Hi hi
也就是說程式碼是一行一行執行,如果你沒有告訴電腦要break(中斷) 離開switch流程的話,程式碼會繼續往下執行,如果接下來也是一個case,他就會進去試試看,如果條件判斷成 true 就會執行。直到判斷為 false 遇到下一個break或是大括號結束。
關於default
前面有提到說default等於if..else if..else中的else的意思,有些程式語言沒有default是不能正常執行,但在PHP中沒有default還是可以正常執行。
有寫會讓程式架構語意更完整,不過如果你確定不會執行到default(當每個case都不符合的時候),不寫也沒有問題。
case是否會轉換型別?
我們再來測試看看,假如$number = 1(數字1),case是”1”(字串1),PHP會怎麼執行呢?
$number = 1;
switch( $number ){
case 0:
echo "0";
break;
case “1”:
echo "1";
}
?>
輸出結果:
也就是說,如同之前在比較運算子課程裡所提到的,PHP會自動轉換型別(除非在嚴謹模式),即使你在case後寫的是字串1,PHP也會轉換成數字1。
即便反過來,條件裡放字串1,case放數字1,結果仍是一樣。
$number = "1";
switch($number){
case 0:
echo "0";
break;
case 1:
echo "1";
}
?>
輸出結果:
所以在剛剛情況我們可以發現,switch case也可以比對字串,那麼我們可以試看看用switch case比對字串,首先建立一個變數$str = “進度條”。
$str = "進度條";
switch( $str ) {
case "進度條":
echo "進度條<br/>";
break;
case "Progress Bar":
echo "Progress Bar<br/>";
break;
default:
echo "default";
}
?>
輸出結果:
即便字串與數字混和也是可以正常比對?
$str = "進度條";
switch( $str ){
case "進度條":
echo "進度條<br/>";
break;
case "Progress Bar":
echo "Progress Bar<br/>";
break;
case 1:
echo "1";
break;
default:
echo "default";
}
?>
輸出結果:
switch case與HTML傳遞參數
在第12堂我們有學到如何用GET方法和POST方法取得HTML傳遞參數,首先我們要先知道switch case也可以正常比對陣列(之後會教到陣列Array),建立一個變數$str = Array()。
$str = Array();
switch($str){
case "進度條":
echo "進度條<br/>";
break;
case Array():
echo "Array";
break;
case 1:
echo "1";
break;
default:
echo "default";
}
?>
輸出結果:
那麼我們用$_POST取代case的Array()。
$str = Array();
switch($str){
case $_POST:
echo "POST";
break;
default:
echo "default";
}
?>
輸出結果:
代表PHP將Array()與$_POST視為一樣的值,由這邊可以看的出來,PHP其實還真的是蠻不嚴謹的。
如果不確定PHP是否會輸出預期的值的話,我們可以用算術運算子的==來比對。
$str = Array();
echo $str == $_POST; // 兩個 "="
switch($str){
case $_POST:
echo "POST";
break;
default:
echo "default";
}
?>
輸出結果:
1就是true。
對PHP來說,在一般的條件下Array()等於$_POST,
那如果用在嚴謹模式===的情況下,
$str = Array();
echo $str === $_POST; // 三個 "="
switch($str){
case $_POST:
echo "POST";
break;
default:
echo "default";
}
?>
輸出結果:
結果仍是true。
如果把POST方法改成GET方法。
$str = Array();
echo $str === $_GET;
switch($str){
case $_GET:
echo "GET";
break;
default:
echo "default";
}
?>
並透過網址傳值,提供一個參數key=test,
這時因為$str === $_GET是false(因為空的Array()不等於$_GET),所以不會進到case $_GET,而是進到default。
但如果沒有提供參數的話,就會是true($str 等於$_GET)。
結論:
一般來說,還是建議條件和case用同一種型別一起比對,例如全部都是字串或全部都是數字,而不是字串或數字同時出現,這樣很容易混淆並掉入陷阱。
最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!