[RESOLU] SWITCH : Avant de devenir fou... ?!

Petit nouveau ! | 2 Messages

09 juin 2016, 14:29

Salut à tous,

Je viens vers vous pour une question ultra basique et pourtant qui va bientôt me rendre fou...

Voici mon code, un switch très simple :

Code : Tout sélectionner

echo 'Poids total : '.$poidtotal; echo '<br/>Livraison : '; switch ($poidtotal) { case ($poidtotal == 0) : echo 'Option 1'; break; case ($poidtotal > 0 && $poidtotal <= 350) : echo 'Option 2'; break; case ($poidtotal > 350 && $poidtotal <= 700) : echo 'Option 3'; break; }
La page me renvoi :

Poids total : 0
Livraison : Option 2

Au lieu de Option 1, puisque le poids est de 0.... Le script marche très bien pour les autre cas (entre 1 et 350 kg, puis 351 et 700kg), mais pas pour 0... Ca fait deux heures que je tourne en rond, alors que le code est super simple... J'ai essayé une conversion en int, j'ai essayé un <1 à la place du ==0... Mais rien ne change !

Une idée ?
Merci ;)

Mammouth du PHP | 1967 Messages

09 juin 2016, 14:47

le switch n'est pas le mieux pour ça.

mais tu peux faire un switch(true) ... pour que ca marche (voir doc php)

La raison :
le switch va comparer ta valeur $poidstotal avec le résultat de tes conditions.
comme le résultat d'une condition est un booléen, php transforme ton poidtotal en booléen. 0 = false tous les autres = true
donc arrivé au premier cas, 0(FALSE) == TRUE => false
second cas : 0(FALSE) == FALSE (car 0 n'est pas strictement supérieure à 0) => TRUE

pour les autres poids, disons 351
premier cas : 351(TRUE) == FALSE (351 diférent de 0) => FALSE
second cas: 351(TRUE) == FALSE (351 est supérieur à 350) => FALSE
dernier cas: 351(TRUE) == TRUE(351 est dans ton dernier interval) => TRUE

En fait c'est un abus du language php le fait que ca marche pour autre chose que 0
donc soit tu compare true à des conditions soir tu fais une suite de if elseif
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 2 Messages

09 juin 2016, 23:03

MERCI ! J'ai juste remplacé la première condition (0) par un "if" et tout fonctionne parfaitement ;) Et merci aussi pour l'explication !

Bonne soirée