2010-10-26 8 views
1

J'ai besoin de résoudre un problème comme ci-dessous. Je ne suis pas sûr, pouvez-vous suggérer une meilleure méthode?Comment Interval peut être utilisé différemment en php

switch(true){ 
    case $price>100: 
     tooHigh(); 
    break; 
    case (($price<=100) && ($price>70)): 
     negotiate(); 
    break; 
    case (($price<=70) && ($price>20)): 
     accept(); 
    break; 
    case ($price<=20): 
     thankAndEscape(); 
    break; 
} 

Répondre

2

if ($price <= 20) { 
     thankAndEscape(); 
} elseif ($price <= 70) { 
     accept(); 
} elseif ($price <= 100) { 
     negotiate(); 
} else { 
     tooHigh(); 
} 
  1. commutateur (true) est nécessaire dans un petit nombre de cas; le fait que vous faites la vérification avec des expressions dans le mot-clé case signifie que la syntaxe ne correspond pas du tout, c'est une bonne raison d'utiliser la construction if ... elseif. Switch ... syntaxe case a des performances plus élevées en PHP que si ... sinon dans le cas où il n'y a pas un, par exemple, la solution que je suggère (qui a un cas par défaut) ne serait pas utiliser le commutateur. ..case syntaxe.
  2. En faisant des contrôles progressifs, en commençant par la gamme de prix la plus basse et en l'augmentant pas à pas, vous n'avez pas besoin de vérifier toute la gamme, car le premier point de l'intervalle est sûrement plus grand que le dernier . La solution que je suggère est plus simple et solide, donnant de plus de meilleures performances.

Essayez et afficher les résultats/vos impressions (informations sur les performances sont appréciées :)

Cheers!

+0

Je déteste les petits problèmes de performance. J'insiste pour utiliser foreach over for loop! Je pense que la performance peut être accélérée beaucoup sur la logique de travail plutôt que sur les outils. – nerkn

+0

Je suis profondément d'accord :) –

+0

commutateur peut avoir un facteur de 50x amélioration par rapport à une déclaration if. Beaucoup de langues ont ce problème - compilé ou autrement. Mais parfois il n'y a pas d'autre option. Sauf si vous optez pour un paradigme sans condition. – Glycerine

-3

Utilisez do-while.

do { 

if($price > 100) { tooHigh(); break; } 

} while(false); 

http://php.net/manual/de/control-structures.do.while.php

+0

pas sûr comment cela fonctionnerait - pourriez-vous l'expliquer? – Glycerine

+1

Quoi? Comment cela accomplit-il la même chose? –

+0

@ user488149 Je ne pense pas que user488149 soit votre vrai nom non plus ... Je vous parie son quelque chose d'embarrassant comme Bernard ou A. Gorrila! – Glycerine

2
if($price > 100) 
{ 
    //too high 
    tooHigh() 
} 
elseif($price > 70) //it wasn't greater than 100 - is it greater than 70? 
{ 
    //negotiate 
    negotiate() 
} 
elseif($price > 20) //OK, wasn't greater than 70 OR 100 - greater than 20 then? 
{ 
    //accept 
    accept() 
} 
else //Guess not - just don't do anything 
{ 
    //thank and escape 
    thankAndEscape() 
} 

déclarations de cas ne peut pas faire des conditions malheureusement. Ils sont vraiment "si c'est le cas alors ..." dans l'honnêteté brutale

Cela devrait fonctionner comme les conditions tomberont simplement à la prochaine jusqu'à ce qu'il atteigne le fond. si on fait correspondre - le reste de la déclaration est ignoré ... C'est si j'ai ma logique dans le bon sens ...

Je ne pense pas que vous aurez besoin de faire la correspondance de plage comme c'est déjà le cas l'instruction if. Par exemple. L'indication «entre 70 et 20» est simplifiée à plus de 20 inférieure à 70 dans des conditions séparées. Un peu plus efficace et plus facile à lire.

+0

Je suis sûr que son code permet des conditions, car il va exécuter les blocs qui sont booléens vrai. – Matt

+0

Vrai ... Vrai ... (ha, voyez ce que j'ai fait là-bas O-O) – Glycerine

1
if ($price>100) 
{ 
     tooHigh(); 
} 
elseif($price<=100) && ($price>70)) 
{ 
     negotiate(); 
} 
elseif(($price<=70) && ($price>20)) 
{ 
     accept(); 
} 
elseif ($price<=20) 
{ 
     thankAndEscape(); 
} 

semble plus compact et lisible, n'est-ce pas?

Questions connexes