2009-08-25 12 views
9

Czy jest możliwe aby użyć trzy parametry przełącznika przypadku, podobnie jak to:Switch case z trzema parametrami?

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

Jeśli nie, należy po prostu użyć if-else lub tam jest lepszym rozwiązaniem?

+0

Just a wskazówka: Niektóre przełącznik zastosowanie do prostego odnośnika danych, ale za to tablice są lepsze . – OIS

Odpowiedz

22

Składnia jest niepoprawna i nie polecałbym jej, nawet jeśli była. Ale jeśli naprawdę chcesz użyć konstrukt takiego, które można umieścić swoje wartości do tablicy:

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

Myślę, że najlepiej dla nas wszystkich zapomnieć, że tak. – soulmerge

+0

@soulmerge Czy jest w tym coś złego? Jeśli to zadziała, będzie dokładnie tym, czego szukałem! –

1

Nie sądzę, aby składnia była poprawna.

Chciałbym zagnieździć instrukcje przełącznika.

+0

, które byłyby dużo zagnieżdżania z wieloma podobnymi przełącznikami? – OIS

3

Nie masz tutaj sytuacji przełącznika. Masz wiele warunek:

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

To również odpowiada prawdzie, fałszowi, prawda itd. –

+1

Możesz uczynić podpunkt w nawiasach OR (||) zamiast –

3

Chciałbym po prostu użyć if/else

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

lub

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

nie wiem - jeśli naprawdę chcesz to w ten sposób - może rzucić je wszystkie na ciąg, konkatenacji, a następnie użyć wynikowy ciąg w przypadku Twojego przypadku?

1

Inną opcją jest stworzenie funkcji, która odwzorowuje trzy parametry do liczby całkowitej i użyć jej w przełączniku komunikat.

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

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

} 
+0

Podobnie jak odpowiedź Alexa Feinmana, przypuszczam, nie wyjaśniając jednak, jak. – OIS

+0

Niezupełnie. Możesz zrobić wszystko za pomocą funkcji. Ale akceptowanie booleans jako bitów 3-bitowego bajtu jest najbardziej logiczną implementacją, tak. –

1

Jest to rodzaj rzeczy, które kiedyś być obsługiwane przez operatorów bitowe:

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

... z powrotem, gdy 'prawdziwy' był 1.

To mówi się, powyższe jest zwięzły, ale trudno go odczytać i utrzymać. Niemniej jednak, jeśli masz wiele podobnych stwierdzeń, przesuwając/Anding może być droga, aby dostać wszystko pod kontrolą:

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 
}