2009-08-25 24 views
9

Ist es möglich, drei Parameter in switch-case zu verwenden, wie folgt aus:Schaltergehäuse mit drei Parametern?

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

Wenn nicht, sollte ich if-else oder gibt es eine bessere Lösung verwenden nur?

+0

Nur ein Tipp: Einige verwenden Schalter für einfache Daten Lookup, aber für die Arrays sind besser . – OIS

Antwort

22

Die Syntax ist nicht korrekt und ich würde es nicht empfehlen, auch wenn es war. Aber wenn Sie wirklich ein Konstrukt wie das verwenden möchten, können Sie Ihre Werte in ein Array setzen:

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

Ich denke, es ist das Beste für uns alle zu vergessen, dass es so ist. – soulmerge

+0

@soulmerge Gibt es etwas Schlechtes daran? Wenn das funktioniert, wird es genau das sein, wonach ich gesucht habe! –

1

Ich glaube nicht, dass Ihre Syntax gültig ist.

Ich würde die Switch-Anweisungen verschachteln.

+0

das wäre eine Menge Verschachtelung mit mehreren ähnlichen Schaltern? – OIS

3

Sie haben hier keine Schaltsituation. Sie haben eine Mehrfachbedingung:

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

Das stimmt auch mit true, false, true usw. überein. –

+1

Sie könnten die Unterklausel in ein ODER (||) setzen anstatt –

3

Ich würde nur die if/else

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

oder

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

Ich weiß es nicht - wenn Sie es wirklich so wollen - Vielleicht kannst du sie alle in eine Zeichenfolge umwandeln, verketten und dann die resultierende Zeichenfolge in deinem Fall verwenden?

1

Eine weitere Option ist eine Funktion zu erstellen, die Karten drei Parameter zu einer ganzen Zahl und verwenden, die in dem Schalter Erklärung.

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

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

} 
+0

Ähnlich wie bei Alex Feinman antworte ich, ohne zu erklären wie. – OIS

+0

Nicht genau. Sie können alles mit der Funktion machen. Aber die Booleans als Bits eines 3-Bit-Bytes zu akzeptieren, ist die logischste Implementierung, ja. –

1

Dies ist die Art von Dingen, die von Bit-Operatoren behandelt verwendet werden:

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

... zurück, wenn 'true' war 1.

Das, das oben gesagt ist prägnant, aber es ist ziemlich schwer zu lesen und zu pflegen. Dennoch, wenn Sie viele ähnliche Aussagen haben, Verschieben/ANDing könnte ein Weg zu gehen Dinge unter Kontrolle zu bekommen:

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 
}