2009-08-25 6 views
9

Est-il possible d'utiliser trois paramètres dans le commutateur cas, comme celui-ci:Interrupteur avec trois paramètres?

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

Sinon, dois-je utiliser simplement si-else ou est-il une meilleure solution?

+0

Juste un conseil: Certains commutateur d'utilisation pour la recherche de données simple, mais pour que les tableaux sont mieux . – OIS

Répondre

22

La syntaxe n'est pas correcte et je ne la recommanderais pas, même si c'était le cas. Mais si vous vraiment voulez utiliser une construction comme ça, vous pouvez mettre vos valeurs dans un tableau:

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

Je pense qu'il est préférable pour nous tous d'oublier que c'est le cas. – soulmerge

+0

@soulmerge Y at-il quelque chose de mal à ce sujet? Si cela fonctionne, ce sera exactement ce que je cherchais! –

1

Je ne pense pas que votre syntaxe soit valide.

Je imbrique les instructions de commutateur.

+0

ce serait beaucoup d'imbrication avec plusieurs commutateurs similaires? – OIS

3

Vous n'avez pas de situation de commutation ici. Vous avez une condition multiple:

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

Cela correspond également à vrai, faux, vrai, etc –

+1

Vous pourriez faire la sous-clause entre parenthèses un OR (||) à la place –

3

Je voudrais simplement utiliser le if/else

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

ou

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

Je ne sais pas - si vous voulez vraiment de cette façon - peut-être les convertir tous en chaîne, concaténer et ensuite utiliser la chaîne résultante dans votre condition de cas?

1

Une autre option est de créer une fonction qui trois paramètres à un nombre entier et l'utiliser dans le commutateur déclaration.

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

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

} 
+0

Semblable à Alex Feinman réponse je suppose, sans expliquer comment cependant. – OIS

+0

Pas exactement. Vous pouvez faire n'importe quoi avec la fonction. Mais accepter les booléens comme des bits d'un octet de 3 bits est l'implémentation la plus logique, oui. –

1

C'est le genre de chose qui était auparavant traité par les opérateurs au niveau du bit:

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

... retour quand « vrai » était 1.

Cela étant dit, ce qui précède est concis, mais c'est assez difficile à lire et à maintenir. Néanmoins, si vous avez beaucoup de déclarations similaires, décalage/ANDing pourrait être un moyen d'aller à faire avancer les choses sous contrôle:

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 
} 
Questions connexes