2012-11-27 64 views
0

代碼:PHP開關下降,雖然問題

switch ($_GET['operation']) { 
    case "professionist": 
    case "company": 
    case "student": 
     echo "ok<br>"; 

    case "professionist": 
     echo "inprofessionist<br>"; 
     break; 

    case "company": 
     echo "incompany<br>"; 
     break; 

    default: 
     echo "Meh!<br>"; 
     break; 
} 

我的目標是先執行一些(通用professionist /公司/學生)的代碼,然後執行取決於操作的代碼的其餘部分...

問題是,前3例完美地工作,但如果例如操作是「公司」,交換機繼續「專業」的情況下,我做錯了什麼?如何改善?在此先感謝...

+0

你忘了前案「professionist」 – Sacx

回答

3

這就是開關的工作原理。如果你總是需要打印「OK」,然後移動它外面開關:

$op = $_GET["operation"]; 

if (in_array($op, array("professionist", "company"))) { 
    echo "ok<br>"; 
} 

switch ($op) { 
    case "professionist": 
     echo "inprofessionist<br>"; 
     break; 

    case "company": 
     echo "incompany<br>"; 
     break; 

    default: 
     echo "Meh!<br>"; 
     break; 
} 
+0

大答案休息,只是要注意:'in_array($針,數組$草垛)' – Dale

+0

是的,你是對的 –

2

只有第一case與給定值將永遠被switch有針對性。 (實際上,每個執行只有一個switch只有一個案例 - 雖然只是讓你有多個案例共享一些代碼,但其中只有一個是實際觸發的。)

因此,它不會使感覺有多個case es與他們正在尋找的價值相同 - switch陳述與一系列獨立if s不是同一個東西;它是跳躍目標的映射。

從本質上講,假設你有一個這樣的開關:

w;        // 001 
switch ($foo) {     // 002 
    case 'a': 
    w;       // 003 
    case 'b': 
    x;       // 004 
    break;      // 005 
    case 'c': 
    y;       // 006 
} 
z;        // 007 

究竟捲起有效的情況是,你有效地得到一些像這樣的代碼(注:來自這實際上是如何工作的高度簡化):

001 v 
002 jump based on $foo: [a -> 003, b -> 004, c -> 006] 
003 w 
004 x 
005 jump to 007 
006 y 
007 z 

然後該程序只是從上到下運行。

  • $foo爲「a」的情況下,跳轉到003和從那裏運行,這意味着它捲起操作的方式在總v,jump,w,x,z
  • $foo爲'b'的情況下,它跳轉到004並從那裏開始運行,這意味着它總共執行v,jump,x,z
  • $foo爲'c'的情況下,跳轉到006並從那裏開始運行,這意味着它總共執行了v,jump,y,z