2010-09-05 5 views
4

Je suis en train de dire $level > -100 && $level < 100problème php switch case

$level = 0; 

       switch($level){                      

       case $level > -100:                     
       break; 
       case $level < 100:                     
       break; 
       default: 
       echo '5'; 
       return null;                       
       }    

pouvez-vous utiliser une instruction switch comme celui-ci.

+0

Vérifie ma réponse. C'est possible en utilisant Switch. Mais je dois vous dire, ce n'est pas une bonne utilisation de Switch. – Starx

+0

Voir mon commentaire à la réponse de nikic – Mchl

+0

Je ne vois pas comment la construction de commutateur proposée se rapproche (($ level> -100) && ($ level <100)). Vous avez 3 cas, le premier qui attrape -99, le second qui attrape -110, et le troisième (par défaut) n'est jamais appelé. – Peter

Répondre

6

Aucune des réponses présentées à ce jour ont explicitement connecté l'esprit de la question initiale avec une construction de commutateur approprié. Donc, pour l'enregistrement:

switch (true) { 
    case (($level>-100) && ($level<100)): 
     echo 'in range one'; 
     break; 
    case (($level>200) && ($level<300)): 
     echo 'in range two'; 
     break; 
    default: 
     echo 'out of range'; 
} 

Il n'y a absolument rien de mal à cette utilisation du commutateur.

+0

Avez-vous oublié la déclaration de rupture? –

+0

Oui, en effet, j'ai fait! Merci, je les ai ajoutés. – Peter

0

Non, vous ne pouvez pas. Switch ne fait que la comparaison de type "égal".

+0

Vous vous sentez mieux maintenant? – Mchl

+0

+1 parce que ce n'est certainement pas -1 – NikiC

0

Non, vous ne pouvez pas. L'instruction switch nécessite des littéraux dans les blocs case. Utilisez une instruction if à la place:

if(!($level > -100 && $level < 100)) 
{ 
    echo '5'; 
    return null; 
} 
+0

comment le niveau peut-il être inférieur à -100 et supérieur à 100? –

+0

meh, fausse restauration. merci – Femaref

4

Quand vous dites que switch ($level) vous comparez déjà la valeur de $level. Chaque case peut alors seulement vérifier l'égalité, vous ne pouvez pas faire de comparaison comme dans votre exemple. Vous devrez utiliser une instruction if à la place:

if ($level > -100 && $level < 100) 
    ; // do nothing; equivalent of break in this case 
else 
    echo '5'; 

Encore plus simple, infirment seulement les conditions:

if ($level <= -100 || $level >= 100) 
    echo '5'; 
-3

C'est l'une des raisons pour lesquelles les gens qui défendent case comme une solution supérieure à if-else sont hors base. Je n'aime pas la syntaxe ou les limitations - if-ifelse-else est beaucoup plus utile.

+0

cela n'aide pas à la question du tout. – Femaref

+0

Aucun des deux n'est «supérieur» à l'autre; chacun a ses propres utilisations. Dans ce cas, une instruction 'if' gagne. – casablanca

+0

Les bons outils pour le bon travail ... – Mchl

2

Les autres réponses sont correctes et incorrectes en même temps. Incorrect, en ce qu'il est possible de faire ce que vous voulez en PHP ... changer switch($level) à switch(true) et votre exemple va fonctionner. Correct, en ce sens que c'est une mauvaise forme et si d'autres programmeurs voient cela dans votre code, ils viendront probablement après vous avec des fourches. Ce n'est pas la façon dont l'instruction switch est destinée à être utilisée, et ne fonctionnerait pas comme ça dans la plupart des autres langues.

+3

Je pense que c'est intéressant. Le fait que vous pouvez définir le commutateur sur true et évaluer pour cela est clairement intentionnel. C'est aussi quand vous y réfléchissez est parfaitement logique. Ce que je n'appellerais pas cela est intuiative. Il semble que ce soit un cas où des rapaces tombent du ciel. – Prospero

+0

Je ne suis pas d'accord que switch (true) est une mauvaise forme en PHP. Il est * vrai que certains autres langages (comme Java) ne supportent pas la syntaxe switch (true). Mais beaucoup de langages * supportent * des constructions similaires (y compris Perl, Groovy et Go), donc vous ne pouvez pas vraiment faire l'argument que "personne d'autre ne le fait, donc vous non plus". Et je prétends que lorsqu'il est correctement utilisé, il peut réellement rendre le code PHP au moins aussi facile à lire qu'une chaîne d'if/then elses. – Peter

4

En dehors des if/else, une autre façon de le faire:

switch (true)                    
    case $level > -100: 
     break; 
    case $level < 100: 
     break; 
    default: 
     echo '5'; 
     return null; 
} 
+1

Ce n'est pas vraiment la même chose que '$ level> -100 && $ level <100'. Considérons '$ level = -200'. Il ne se cassera pas sur le premier cas, mais se cassera au second. En fait, la ligne 'echo 5;' ne sera jamais atteinte. – Mchl

+0

@Mchl - Vous avez raison, mais c'est en fait un bug dans la question initiale. La réponse de NikiC est syntaxiquement correcte, et est probablement ce que le demandeur voulait faire. – Peter