IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Difficulté avec switch [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut Difficulté avec switch
    Bonjour,

    Je comprends pas 2 choses concernant "switch et case"; je crois comprendre que 'switch' n'exécute l'instruction que si la valeur correspond (est égal ); or, le code suivant fonctionne bien alors que la valeur est comprise entre deux "cases".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <head><title>14_switch_2</title></head>
        <body>
            <h2>14_switch_2</h2><br/>
            <h2>Entrez les données suivantes </h2>
            <form name="formulaire" method="post" action="14_switch_2.php">
                Entrez x : <input type="text" name="x"/> <br/>
                Entrez y : <input type="text" name="y"/> <br/>
                Entrez z : <input type="text" name="z"/> <br/><br/>
                <input type="submit" name="valider" value="OK"/>
            </form>
     
    		<?php
    		if(isset($_POST['valider'])){
            $x=$_POST['x'];
            $y=$_POST['y'];
            $z=$_POST['z'];
     
    		echo 'x = '.$x.'<br/>';
    		echo 'y = '.$y.'<br/>';
    		echo 'z = '.$z.'<br/>';
    		}
     
    		switch ($x) {
     
    		case 0:
    		echo "0 < ou = x < 1";
    		break;
    		case 1:
    		echo "1 < ou = x < 2";
    		break;
    		case 2:
    		echo "2 < ou = x < 3";
    		break;
    		case 3:
    		echo "3 < ou = x";
    		}
     
            ?>
        </body>
    </html>
    D'autre part, je lis sur le site http://www.php.net/manual/fr/control...res.switch.php "Une autre chose à mentionner est que la valeur du case peut être toute expression de type scalaire, c'est-à-dire nombre entier, nombre à virgule flottante et chaîne de caractères. Les tableaux sont sans intérêt dans ce contexte-là." J'ai donc créé le code suivant en espérant qu'il fonctionne ; où est l'erreur?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <head><title>14_switch_3</title></head>
        <body>
            <h2>14_switch_3</h2><br/>
            <h2>Entrez les données suivantes </h2>
            <form name="formulaire" method="post" action="14_switch_3.php">
                Entrez x : <input type="text" name="x"/> <br/>
                Entrez y : <input type="text" name="y"/> <br/>
                Entrez z : <input type="text" name="z"/> <br/><br/>
                <input type="submit" name="valider" value="OK"/>
            </form>
     
    		<?php
    		if(isset($_POST['valider'])){
            $x=$_POST['x'];
            $y=$_POST['y'];
            $z=$_POST['z'];
     
    		echo 'x = '.$x.'<br/>';
    		echo 'y = '.$y.'<br/>';
    		echo 'z = '.$z.'<br/>';
    		}
     
    		switch ($x) {
     
    		case 0:
    		echo "0 < ou = x < 1.5";
    		break;
    		case 1.5:
    		echo "1.5 < ou = x < 2.5";
    		break;
    		case 2.5:
    		echo "2.5 < ou = x < 3.5";
    		break;
    		case 3.5:
    		echo "3.5 < ou = x";
    		}
     
            ?>
        </body>
    </html>
    Merci et à bientôt.

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    je ne connais pas php, mais les switch case j'en ai vu dans plein de language:

    1/ Je pense qu'il manque un break à la fin du dernier case.

    2/ il manque une section default (qui doit ausi avoir un break a mon avis) au cas ou ta valeur n'a rien a voir ave ce que tu attend.

    3/ Ensuite le case va comparer la valeur avec celle du case ce sera donc un "="
    mais peu etre qu'il prend la partie entiere de x comme base de comparaison

    si x = 1.25 , sa partie entière sera 1....


    ------

    Cela donnerai quelque chose comme ça


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    switch ($x) {
     
    		case 0:
    		echo "x=0";
    		break;
    		case 1.5:
    		echo "x=1.5";
    		break;
    		case 2.5:
    		echo "x=2.5";
    		break;
    		case 3.5:
    		echo "x=3.5";
                              break;
                              default:
                              echo " oups x ne rentre pas dans les cases.
                              break;

  3. #3
    Membre éclairé Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 496
    Par défaut
    C'est exactement ça !!!
    Il manque les break et le default est vivement conseillé

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 74
    Par défaut
    En effet, l'utilisation du case default est une bonne pratique a adopter.
    En revanche le fait qu'il manque un break sur le dernier case ne change pas grand chose à vrai dire. En effet, après un l'execution d'un cas, switch continue et test le cas d'après, sauf si l'on ajoute un break. Ici le default étant le dernier cas, le break est optionnel puisque de toute façon il n'y a plus de cas a traiter.

    En revanche, le code de jabbounet est plus préci.

    En effet, en reprenant votre exemple, la valeur 3 entrainerai l'execution du default, et non du case '2.5' comme le laisser suggérer le code d'éric.

    Par contre il manque un guillemet avant ton dernier break jabbounet

  5. #5
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par _IpC_ Voir le message
    En effet, l'utilisation du case default est une bonne pratique a adopter.
    En revanche le fait qu'il manque un break sur le dernier case ne change pas grand chose à vrai dire. En effet, après un l'execution d'un cas, switch continue et test le cas d'après, sauf si l'on ajoute un break. Ici le default étant le dernier cas, le break est optionnel puisque de toute façon il n'y a plus de cas a traiter.
    sur certains langage c'est génant d'oublier des break, et c'est une bonne habitude à prendre.

    Par contre il manque un guillemet avant ton dernier break jabbounet
    je n'ai jamais fais de php donc je n'ai pas de moyen de faire des correction syntaxique a la volée....

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    Merci.

    Mais j'ai pourtant bien lu que pour le dernier 'case' le break n'est pas utile (puisque le switch est terminé).

    D'accord pour 'default' >>> si je comprends bien il vaut mieux toujours y penser - par exemple pour afficher un message à l'utilisateur si les données ne correspondent etc.

    Je reformule ma question :

    Peut-on utiliser des "case 1.5:" "case 2.5:" etc. ?
    Si on peut, qu'est-ce qui ne fonctionne pas dans mon (deuxième) code;
    selon moi, ce n'est ni le break final ni le default.

    Rappel : mon 1e code fonctionne bien.

    Merci.

  7. #7
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    Je ne comprends pas pourquoi tu dis que l'autre code est plus précis.
    Il répond simplement à une égalité mais ce n'est pas ce que je cherche à résoudre; ce que je cherche c'est à encadrer (au sens mathématique) un nombre. Par exemple, quand je rentre x=2.7, ce que j'attends c'est que l'on m'affiche ""2.5 < ou = x < 3.5".

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Pour autant que je sache un switch/case teste uniquement des égalités. Si tu veux des intervalles, il faut revenir aux bons vieux if/elseif/else...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    if ($x < 0)
    {
      echo 'x<0';
    }
    elseif ($x < 1)
    {
      echo '0 <= x < 1';
    }
    elseif ($x < 2)
    {
      echo '1 <= x < 2';
    }
    else
    {
      echo 'x >= 2';
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  10. #10
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Pour autant que je sache un switch/case teste uniquement des égalités. Si tu veux des intervalles, il faut revenir aux bons vieux if/elseif/else...
    Visiblement pas en php, enfin si ce site est sérieux
    http://www.php.net/manual/fr/control...res.switch.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    // Create loop to display links
    for($i = 0; $i < count($link); ++$i)
    {
        // Create randomizer
        // Use switch statement to find font size
        $randomizer = rand(1,50);
        switch($randomizer)
        {
        case ($randomizer <= 20):
        $font_size = "11";
        break;
     
        case ($randomizer <= 30):
        $font_size = "16";
        break;
     
        case ($randomizer <= 40):
        $font_size = "18";
        break;
     
        case ($randomizer <= 50):
        $font_size = "20";
        break;
        }
     
        // Display the link
        echo '<span style="font-size: ' .$font_size. ';">' .$link[$i]. '</span>&nbsp;&nbsp;';
     
    // Loop the next link
    }

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    Sauf que le 1e code que j'ai mentionné me permet d'encadrer des nombres entiers. Ce 1e code fonctionne bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <head><title>14_switch_2</title></head>
        <body>
            <h2>14_switch_2</h2><br/>
            <h2>Entrez les données suivantes </h2>
            <form name="formulaire" method="post" action="14_switch_2.php">
                Entrez x : <input type="text" name="x"/> <br/>
                Entrez y : <input type="text" name="y"/> <br/>
                Entrez z : <input type="text" name="z"/> <br/><br/>
                <input type="submit" name="valider" value="OK"/>
            </form>
     
    		<?php
    		if(isset($_POST['valider'])){
            $x=$_POST['x'];
            $y=$_POST['y'];
            $z=$_POST['z'];
     
    		echo 'x = '.$x.'<br/>';
    		echo 'y = '.$y.'<br/>';
    		echo 'z = '.$z.'<br/>';
    		}
     
    		switch ($x) {
     
    		case 0:
    		echo "0 < ou = x < 1";
    		break;
    		case 1:
    		echo "1 < ou = x < 2";
    		break;
    		case 2:
    		echo "2 < ou = x < 3";
    		break;
    		case 3:
    		echo "3 < ou = x";
    		}
     
            ?>
        </body>
    </html>
    Le problème vient quand je remplace ces nombres entiers par des nombres décimaux. Hors cela semble possible d'après certains commentaires.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    Excuse Jabbounet - Tu as écrit en même temps que moi et je n'ai pas lu ton dernier message. Sinon d'accord avec toi Jabbounet.

  13. #13
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    Visiblement pas en php, enfin si ce site est sérieux
    http://www.php.net/manual/fr/control...res.switch.php
    je doute que tu trouves plus sérieux que le site des éditeurs de PHP Et j'aurais appris quelque chose...
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  14. #14
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par Celira Voir le message
    je doute que tu trouves plus sérieux que le site des éditeurs de PHP Et j'aurais appris quelque chose...
    Comme quoi, moi aussi, vu que je ne connais rien a php, maintenant je connais le site officiel

  15. #15
    Membre émérite Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Par défaut
    Personnellement,
    quand je teste ton code,
    lorsque je saisis x=0.5,
    je n'ai pas le message "0 < ou = x < 1".

    En revanche,
    si je saisis x=0,5,
    j'ai droit au message "0 < ou = x < 1".
    Mais, dans ce cas là,
    1,5 n'est pas un nombre décimal.
    et, dans la saisie, ce qui est retenu, c'est le 0, le reste est ignoré.

    Essaye d'ailleurs de saisir "1 million",
    tu verras que ton switch trouve que c'est dans l'intervalle [0,1[.

    Fred

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    Je pense qu'on peu mettre +2 à Fred !

    Ce qui signifierait que switch ne considère que la première partie de ma valeur et la compare au case?

    Mais comment je dois comprendre : "Une autre chose à mentionner est que la valeur du case peut être toute expression de type scalaire, c'est-à-dire nombre entier, nombre à virgule flottante et chaîne de caractères. "

    Je vais quand même étudier le dernier code de Jabbounet qui me semble intéressant.

  17. #17
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Le fait que "1 million" soit considéré comme 1 est normal :
    La valeur est fournie par la portion initiale de la chaîne de caractères. Si la chaîne de caractères commence par un caractère numérique valide, ce sera la valeur utilisée.
    Conversion de chaine de caractères en nombre
    Donc :
    1 Million => 1
    1.2 Million => 1.2
    cent millions => 0

    Citation Envoyé par éric1 Voir le message
    "Une autre chose à mentionner est que la valeur du case peut être toute expression de type scalaire, c'est-à-dire nombre entier, nombre à virgule flottante et chaîne de caractères. "
    En d'autres termes : un switch/case fonctionne aussi bien avec des nombres qu'avec des chaines de caractères.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    Merci pour ta réponse.
    D'où vient cette citation ?

  19. #19
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Tu poses des réponses mais tu connais déjà la question...
    Citation Envoyé par éric1 Voir le message
    Merci pour ta réponse.
    D'où vient cette citation ?
    Citation Envoyé par Celira Voir le message
    Le fait que "1 million" soit considéré comme 1 est normal :

    Conversion de chaine de caractères en nombre
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    Excuse-moi ...
    J'ai cherché sur PHP et sur la page 1 pourtant!

    Merci pour ta patience.

    Merci à tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37
  2. [VBA] difficultés avec une requête INSERT
    Par elias dans le forum Access
    Réponses: 7
    Dernier message: 06/09/2005, 14h53
  3. Difficultés avec - onchange - !
    Par zakuli dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/07/2005, 12h00
  4. [débutant] Probleme avec switch et héritage
    Par durk dans le forum Langage
    Réponses: 2
    Dernier message: 21/04/2005, 09h48
  5. Difficultés avec TMenuItem.OnDrawItem
    Par ybruant dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/01/2005, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo