[RESOLU] Problème d'évaluation du zéro

Petit nouveau ! | 7 Messages

16 avr. 2015, 14:17

Bonjour. Je cherche à comprendre pourquoi la valeur 0 est mal évaluée dans ce bout de code:
<?php
for($taille=-5 ; $taille<512 ; $taille++) {
switch($taille) {
case ($taille >= 500): echo ($taille.' donc le pas est regle a : 60<br/>');break;
case ($taille >= 350): echo ($taille.' donc le pas est regle a : 40<br/>');break;
case ($taille >= 250): echo ($taille.' donc le pas est regle a : 30<br/>');break;
case ($taille >= 200): echo ($taille.' donc le pas est regle a : 25<br/>');break;
case ($taille >= 70) : echo ($taille.' donc le pas est regle a : 12<br/>');break;
case ($taille >= 50) : echo ($taille.' donc le pas est regle a : 8<br/>') ;break;
case ($taille >= 25) : echo ($taille.' donc le pas est regle a : 4<br/>') ;break;
case ($taille >= 0) : echo ($taille.' donc le pas est regle a : 2<br/>') ;break;
default: echo ($taille.' donc le pas est regle a : 1<br/>') ;break;
} $taille.flush(); } ?>
Au passage à 0, il semble que la variable soit évalué comme infini.
Résulat:
-5 donc le pas est regle a : 1
-4 donc le pas est regle a : 1
-3 donc le pas est regle a : 1
-2 donc le pas est regle a : 1
-1 donc le pas est regle a : 1
0 donc le pas est regle a : 60
1 donc le pas est regle a : 2
2 donc le pas est regle a : 2 etc...

Merci de m'apporter vos lumières sur ce problème.

Mammouth du PHP | 688 Messages

16 avr. 2015, 14:46

mystère pour moi

avec
switch($taille) {
case 0 : echo ($taille.' donc le pas est regle a : 2<br/>') ;break;
....

cela fonctionne

Petit nouveau ! | 7 Messages

16 avr. 2015, 14:54

mystère pour moi

avec
switch($taille) {
case 0 : echo ($taille.' donc le pas est regle a : 2<br/>') ;break;
....

cela fonctionne
Merci tof73, en effet ça fonctionne, mais l'inconvénient est qu'il me faut traiter le cas 0 à part.
Je ne comprend pas, non plus pourquoi ça ne passe pas.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

16 avr. 2015, 14:58

La structure switch/case permet de remplacer des if/elseif/else dont les conditions sont des égalités strictes.
La valeur spécifiée dans le case ne peut pas être une comparaison (qui est du coup exécutée et retourne 1 ou 0) mais doit obligatoire être une valeur constante.
switch ($tache) {
  case -5 :
  case -4 :
  case -3 :
  case -2 :
  case -1 :
  default :
    echo ($taille.' donc le pas est regle a : 1<br/>') ;
    break;
  case 0 :
  case 1 :
  case 2 :
  ...
  case 24 :
    echo ($taille.' donc le pas est regle a : 2<br/>') ;
    break;
  ...
}
Dans ton cas, ce n'est pas une structure switch/case qu'il te faut, mais bien if/elseif
if ($tache < 0)
  echo ($taille.' donc le pas est regle a : 1<br/>') ;
elseif ($tache < 25)
  echo ($taille.' donc le pas est regle a : 2<br/>') ;
elseif ...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 7 Messages

16 avr. 2015, 15:10

La structure switch/case permet de remplacer des if/elseif/else dont les conditions sont des égalités strictes.
La valeur spécifiée dans le case ne peut pas être une comparaison (qui est du coup exécutée et retourne 1 ou 0) mais doit obligatoire être une valeur constante.
switch ($tache) {
  case -5 :
  case -4 :
  case -3 :
  case -2 :
  case -1 :
  default :
    echo ($taille.' donc le pas est regle a : 1<br/>') ;
    break;
  case 0 :
  case 1 :
  case 2 :
  ...
  case 24 :
    echo ($taille.' donc le pas est regle a : 2<br/>') ;
    break;
  ...
}
Dans ton cas, ce n'est pas une structure switch/case qu'il te faut, mais bien if/elseif
if ($tache < 0)
  echo ($taille.' donc le pas est regle a : 1<br/>') ;
elseif ($tache < 25)
  echo ($taille.' donc le pas est regle a : 2<br/>') ;
elseif ...
Merci Ryle pour ta réponse. Tu m'as mis la puce à l'oreille. En effet l'évaluation dans le case renvoie true ou false. Ce n'est donc pas un switch($taille) qu'il me faut tester mais switch(true) ! Maintenant ça fonctionne.
<?php
for($taille=-5 ; $taille<512 ; $taille++) {
switch(true) {
case ($taille >= 500): echo ($taille.' donc le pas est regle a : 60<br/>');break;
case ($taille >= 350): echo ............