2009-08-25 28 views
9

是否有可能使用的switch-case三個參數,就像這樣:帶三個參數的開關盒?

switch($var1, $var2, $var3){ 
    case true, false, false: 
     echo "Hello"; 
     break; 
} 

如果不是這樣,我應該只是使用if-else或是否有更好的解決辦法?

+0

只是一個提示:有些使用開關簡單的數據查詢,但是對於數組是更好。 – OIS 2009-08-25 14:16:57

回答

22

語法不正確,我不會推薦它,即使它是。但是,如果你真的想用這樣的一個結構,你可以把你的價值觀到一個數組:

switch (array($var1, $var2, $var3)) { 
    case array(true, false, false): 
     echo "hello"; 
     break; 
} 
+2

我認爲最好讓所有人都忘記它。 – soulmerge 2009-08-28 07:45:48

+0

@soulmerge這有什麼不好的?如果這種方法有效,它就是我正在尋找的東西! – 2012-09-22 04:54:15

1

我不認爲你的語法是有效的。

我會嵌套switch語句。

+0

這將是很多嵌套與多個類似的開關? – OIS 2009-08-25 14:57:10

3

這裏沒有切換情況。你有多個條件:

if($var && !($var2 || $var3)) { ... 
+0

這也匹配true,false,true等。 – 2009-08-25 14:09:30

+1

您可以使括號中的子句成爲OR(||),而不是 – 2009-08-25 14:10:30

3

我只想用的if/else

if($var1 == true && $var2 == false && $var3 == false){ 
    echo "Hello"; 
} 

if($var1 && !($var2 && $var3)) { 
    echo "Hello"; 
} 
-1

我不知道 - 如果你真的想這樣說 - 也許將它們全部轉換爲字符串,連接,然後在case情況下使用結果字符串?

1

另一種選擇是創建三個參數映射到整數的功能和使用,在開關聲明。

function MapBool($var1, $var2, $var3){ 
    // ... 
} 

switch(MapBool($var1, $var2, $var3)) { 
    case 0: 
     echo "Hello"; 
     break; 
    // ... 

} 
+0

我想,類似於Alex Feinman的回答,但沒有解釋如何。 – OIS 2009-08-25 14:58:46

+0

不完全。你可以用這個函數做任何事情。但接受布爾值爲3位字節的位是最合理的實現,是的。 – 2009-08-25 18:09:04

1

這是諸如此類的事情,過去由按位運算符來處理:

if (($var1 << 2) & ($var2 << 1) & $var3) == 4) ... 

...回來時,「真」是1

話雖這麼說,上述簡潔,但很難閱讀和維護。不過,如果你有很多類似的語句,移位/取與可能的方式去得到控制的事情:

switch (($var1 << 2) & ($var2 << 1) & $var3)) { 
    case 0: // false, false, false 
     ...stuff... 
    case 1: // false, false, true 
     ...different stuff... 
    // all 8 cases if you REALLY care 
}