[Php] Fonction simple avec petit bug

Résolu
Bonjour,

Voici une fonction simple qui me permets de mettre des étoiles selon une valeur de 0 à 100. La fonction est correcte sauf pour une valeur de 0 ; je comprends pas trop ...

Qui aurait une idée svp ?

function note_show() {
	global $note_value;
	$value = $note_value/20;

	for ( $i = 0; $i < 5; $i++) {
		switch ($value) {
			case ( $value > $i+0.5 ):
			echo '<img src="/images/etoil_full.png" alt=""/> ';
			break;

			case ( $value == $i+0.5 ):
			echo '<img src="/images/etoil_semi.png" alt=""/> ';
			break;
			
			case ( $value <= $i ):
			echo '<img src="/images/etoil_empty.png" alt=""/> ';
			break;
		}
	}
}


Les valeurs de 10 à 100 fonctionnent (1/2 étoile et 5 étoiles). Pour une valeur de 0 ; j'ai 5 étoiles ...
--
Google est ton ami !
Configuration: Windows XP
Firefox 3.5.6

5 réponses

  1. Bonjour

    C'est syntaxiquement correct, mais ça ne fait certainement pas ce que tu veux. En effet, case ( $value > $i+0.5 ) ne signifie absolument pas "dans le cas où $value est supérieur à $i+5". Regarde la signification du switch ... case : on calcule ce qu'il y a dans le switch (ici une simple variable) et ce qu'il y a dans le case. Ce que tu as mis dans le case, c'est une comparaison, c'est à dire un truc qui est soit vrai soit faux.
    Si $value vaut 0, $value > $i+0.5 est faux. Mais $value est lui-même faux (car 0 = faux). Donc la variable du switch ($value) est bien égale à l'expression du case ( $value > $i+0.5 ) puisque les deux sont égaux à faux. Donc on exécute ce case là
    Voilà pourquoi ça ne marche pas comme tu veux.

    Avec des 'if' tu t'en sortiras sans problème.
    1. Parce que dans le switch, les case font références à des entiers ou des strings tandis que dans ton cas, tu fais références à un booléen :

      il ne faut pas comprendre
      case ( x > y )
      comme "dans le cas où x est supérieur à y", mais comme
      "si ta $value est aussi vrai que x est supérieur à y" ce qui n'a strictement aucun sens dans la logique (bien que ça soit syntaxiquement cohérence.
      1. Bonjour,

        Je peux me tromper, mais est-ce correct d'utiliser le switch case comme ca ? C'est a dire, de tester une condition d'égalité dans le case ?

        Peut-être qu'en remplaçant par des if else, ce sera mieux ?
        1. Bonjour,

          D'accord avec Mopra-L, l'utilisation du case est pas type top. :/
          Le If/Else serait mieux.
      2. En effet avec des if, ca passe sans problèmes. Merci à vous trois.

        A part pour l'explication donné par "le père" ; pourquoi l'utilisation du switch n'était pas bonne ? Trop simple comme conditions pour utiliser le switch ?