進度條

【PHP】14. Switch-case 條件判斷

【PHP】14. Switch-case 條件判斷

作者: 進度條編輯群 更新日期:

此文章也有影片介紹,可以搭配影片一起學習!

01. Switch-case條件判斷 (所屬課程)

02. Switch-case條件判斷 (所屬課程)


以下正式開始文章


之前我們學到了 if..else if..else的用法,可以同時進行多種條件判斷。

 

<?php

  $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";

?>    

 

輸出結果:

0    

 

但如果要分析的東西越來越多時,程式碼就會越來越長,如果又使用大括號,不但造成視覺上的混雜也容易打錯。因此我們可以利用另一個語法 - switch case,讓程式碼更精簡與可讀性更強。

 


雖然 switch case 在某些程式語言上面並不等同於if..else if..else,但大致上的用法是一致的。

 

switch case的寫法

 

 

輸出結果:

1

 

在switch case裡,程式碼會由上往下一行一行跑,如果case的值與條件的值一致,則會執行指定的指令。

 

執行完畢遇到break(中斷),就會跳出switch判斷式(switch case裡後面的程式碼都不會被執行)。

 

如果所有的case的值都不符合條件的值,可以在最後設定default,顯示提示內容,類似if..else if..else中的else。

 

例如將上面的$number = 1改成 $number = 4,因為所有的case的值都沒有4,所以會跳到default,印出default。

 

<?php

  $number = 4;

  switch ( $number ) {
    case 0:
      echo "0";
      break;
    case 1:
      echo "1";
      break;
    case 2:
      echo "2";
      break;
    default:
      echo "default";
      break;
  }
?>    

 

輸出結果:

default    

 

1. case後要空一格
2. 和if..else if..else不同,中間的指令可以不只一行(如上面echo可以不只一行)

   

 

3. 即使不小心沒有對齊,PHP還是可以正常執行(但最好還是整理整齊比較好啦^^)

 

 

關於break

你可能會注意到switch case裡面有一個break,如果我們把break拿掉的話,程式會如何執行?

 

<?php

  $number = 0;

  switch ( $number ) {
    case 0:
      echo "0";
      echo "1";
      echo "<br>";
    case 1:
      echo "Hi hi<br/>";
  }

?>    

 

輸出結果:

01
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會怎麼執行呢?

 

<?php

  $number = 1;

  switch( $number ){
    case 0:
      echo "0";
      break;
    case “1”:
      echo "1";
  }

?>    

 

輸出結果:

1    

 

也就是說,如同之前在比較運算子課程裡所提到的,PHP會自動轉換型別(除非在嚴謹模式),即使你在case後寫的是字串1,PHP也會轉換成數字1。

即便反過來,條件裡放字串1,case放數字1,結果仍是一樣。

 

<?php

  $number = "1";

  switch($number){
    case 0:
      echo "0";
      break;
    case 1:
      echo "1";
  }

?>    

 

 

輸出結果:
 

1

 

所以在剛剛情況我們可以發現,switch case也可以比對字串,那麼我們可以試看看用switch case比對字串,首先建立一個變數$str = “進度條”。

 

<?php

  $str = "進度條";
  switch( $str ) {
    case "進度條":
      echo "進度條<br/>";
      break;
    case "Progress Bar":
      echo "Progress Bar<br/>";
      break;
    default:
      echo "default";
  }

?>    

 

 

輸出結果:

 

進度條    

 

 

即便字串與數字混和也是可以正常比對?

 

<?php
 
  $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()。

 

<?php
  $str = Array();

  switch($str){
    case "進度條":
      echo "進度條<br/>";
      break;
    case Array():
      echo "Array";
      break;
    case 1:
      echo "1";
      break;
    default:
      echo "default";
  }

?>    

 

 

輸出結果:

 

Array    

 

那麼我們用$_POST取代case的Array()。

 

<?php

  $str = Array();
  switch($str){
    case $_POST:
      echo "POST";
      break;
    default:
      echo "default";
  }

?>    


輸出結果:

 

POST    

 

代表PHP將Array()與$_POST視為一樣的值,由這邊可以看的出來,PHP其實還真的是蠻不嚴謹的。

如果不確定PHP是否會輸出預期的值的話,我們可以用算術運算子的==來比對。

 

 

<?php

  $str = Array();
  echo $str == $_POST;    // 兩個 "=" 

  switch($str){
    case $_POST:
      echo "POST";
      break;
    default:
      echo "default";
  }

?>    

 

輸出結果:

1POST    

1就是true。

 

對PHP來說,在一般的條件下Array()等於$_POST,
那如果用在嚴謹模式===的情況下,

 

<?php

  $str = Array();
  echo $str === $_POST;     // 三個 "=" 

  switch($str){
    case $_POST:
      echo "POST";
      break;
    default:
      echo "default";
  }

?>    

 

輸出結果:

1POST    

結果仍是true。

 


如果把POST方法改成GET方法。
 

<?php
  $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粉絲團按讚喔!!

Small logo

進度條編輯群

進度條編輯團隊