2009-08-25 22 views
9

¿Es posible utilizar tres parámetros en switch de los casos, así:¿Switch caja con tres parámetros?

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

Si no es así, ¿debo usar if-else o hay una solución mejor?

+0

Sólo un consejo: Algunos interruptor uso de simples operaciones de búsqueda de datos, pero para que las matrices son mejores . – OIS

Respuesta

22

La sintaxis no es correcta y no lo recomendaría, incluso si lo fuera. Pero si realmente desea utilizar una construcción de esa manera, usted puede poner sus valores en una matriz:

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

Creo que es mejor para todos nosotros olvidar que sí. – soulmerge

+0

@soulmerge ¿Hay algo malo sobre esto? Si esto funciona, ¡será exactamente lo que estaba buscando! –

1

No creo que su sintaxis sea válida.

Anidaría las instrucciones de cambio.

+0

que sería una gran cantidad de anidación con múltiples interruptores similares? – OIS

3

No tiene una situación de cambio aquí. Usted tiene una condición múltiple:

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

Eso también coincide con verdadero, falso, verdadero, etc. –

+1

Puede hacer que la sub-cláusula entre paréntesis sea OR (||) en su lugar –

3

me acaba de utilizar el if/else

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

o

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

No sé - si realmente quiere de esta manera - tal vez los envie a todos a una cadena, concatene y luego use la cadena resultante en la condición de su caso?

1

Otra opción es crear una función que mapea tres parámetros para un entero y el uso que en el conmutador declaración.

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

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

} 
+0

Similar a la respuesta de Alex Feinman, supongo, sin explicar cómo. – OIS

+0

No exactamente. Puedes hacer cualquier cosa con la función. Pero aceptar los booleanos como bits de un byte de 3 bits es la implementación más lógica, sí. –

1

Este es el tipo de cosas que solía ser manejados por operadores de bits:

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

... volver al 'verdadero' era 1.

Dicho esto, lo anterior es conciso, pero es bastante difícil de leer y mantener. Sin embargo, si usted tiene una gran cantidad de declaraciones similares, cambiando/AND podría ser un camino a seguir para hacer las cosas bajo control:

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 
}