2009-08-25 2 views
9

Можно использовать три параметра в случае выключателя, например:Корпус выключателя с тремя параметрами?

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

Если нет, я должен просто использовать, если-то еще, или есть лучшее решение?

+0

Просто подсказка: Некоторые из них использует переключатель для простого поиска данных, но для этого массивы лучше , – OIS

ответ

22

Синтаксис неправильный, и я бы не рекомендовал его, даже если бы он был. Но если вы действительно хотите использовать конструкцию, как это, вы можете поместить свои значения в массив:

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

Я думаю, что лучше всего всем нам забыть, что он делает. – soulmerge

+0

@soulmerge Что-то плохое в этом отношении? Если это сработает, это будет именно то, что я искал! –

1

Я не думаю, что ваш синтаксис действителен.

Я бы установил инструкции коммутатора.

+0

, что было бы много гнездования с несколькими аналогичными переключателями? – OIS

3

У вас нет ситуации переключения здесь. У вас есть несколько условий:

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

Это также соответствует true, false, true и т. Д. –

+1

Вы можете сделать подпункт в скобках вместо OR (||) –

3

Я бы просто использовать, если/еще

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

или

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

Я не знаю, - если вы действительно хотите это так - возможно, бросить их все в строку, объединить, а затем использовать результирующую строку в вашем случае?

1

Другой вариант заключается в создании функции, которая отображает три параметра в целое и использовать его в переключателе заявление.

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

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

} 
+0

Как и в случае с Алексом Фейнманом, я полагаю, не объясняя, как все же. – OIS

+0

Не совсем. Вы можете делать все с помощью функции. Но принятие логических значений как битов 3-битного байта является наиболее логичной реализацией, да. –

1

Это та вещь, которая используется для обрабатываться операторами поразрядными:

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

... назад, когда «истина» было 1.

Это, как говорится, выше является кратким, но его довольно трудно читать и поддерживать. Тем не менее, если у вас есть много подобных заявления, меняющихся/операция AND может быть путем, чтобы получить вещи под контролем:

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 
} 
Смежные вопросы