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 :

While et foreach : utilisation foreach sans while et avec while


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut While et foreach : utilisation foreach sans while et avec while
    Bonjour,
    J'aimerais bien savoir la différence entre 2 codes qui donne la même chose.
    1er code, ci-dessous,que j'ai fait avec While :
    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
    $compteur = count($data_json_obj_array['produits'] );
    $i = 0;																	
    while ($i < $compteur)
    	{
    		foreach ($data_json_obj_array['produits'] as $val_color) 
    			{
    				switch($val_color['color'])
    				 {
    					 case 'red' :
    						echo '<p>Rouge</p>';
    						break;
     
    					case 'orange' :
    						echo '<p>Orange</p>';
    						break;
     
    					case 'purple' :
    						echo '<p>Violet</p>';
    						break;
     
    					default:
    					   echo '<p>Inconnu</p>';
     
     
    				 }
    			$i++;
    			}	
    	}
    2e même code, mais sans la boucle while :
    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
    $data_json_obj_array = json_decode($data_json_obj, true);
     
    	foreach ($data_json_obj_array['produits'] as $val_color) 
    		{
    			switch($val_color['color'])
    			 {
    				 case 'red' :
    					echo '<p>Rouge</p>';
    					break;
     
    				case 'orange' :
    					echo '<p>Orange</p>';
    					break;
     
    				case 'purple' :
    					echo '<p>Violet</p>';
    					break;
     
    				default:
    				   echo '<p>Inconnu</p>';
     
     
    			 }
    	}
    même résultat :
    Rouge
    Rouge
    Orange
    Violet
    Orange
    Inconnu
    Je me suis un peu perdu : pour choisir l'un de deux.
    En fait, j'ai utilisé la 1re parce que je pensais ainsi.
    Ensuite, par curiosité, j'ai supprimé le while pour voir si cela marche. Et je vois que la 2e marche aussi.
    Du coup, je ne sais pas si les deux exactement la même chose, mais 2e est plus épuré ?
    Que vous pensez ?
    Merci

    Voici le code avec la data :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    $data_json_obj = '{
       "commande": "12578",
       "name": "toto",
       "produits": [
          {
             "grams": 0,
             "product_id": 11111,
             "name": "tomate",
             "color": "red"
          },
          {
             "grams": 1000,
             "product_id": 11112,
             "name": "pomme",
             "color": "red"
          },
          {
             "grams": 1000,
             "product_id": 11114,
             "name": "orange",
             "color": "orange"
          },
          {
             "grams": 2050,
             "product_id": 11113,
             "name": "aubergine",
             "color": "purple"
          },
          {
             "grams": 1000,
             "product_id": 11162,
             "name": "carotte",
             "color": "orange"
          },
          {
             "grams": 1000,
             "product_id": 11115,
             "name": "patate",
             "color": ""
          }
       ]
    }';
     
    $data_json_obj_array = json_decode($data_json_obj, true);
    echo '<h1>avec while</h1>';
    $compteur = count($data_json_obj_array['produits'] );
    $i = 0;																	
    while ($i < $compteur)
    	{
    		foreach ($data_json_obj_array['produits'] as $val_color) 
    			{
    				switch($val_color['color'])
    				 {
    					 case 'red' :
    						echo '<p>Rouge</p>';
    						break;
     
    					case 'orange' :
    						echo '<p>Orange</p>';
    						break;
     
    					case 'purple' :
    						echo '<p>Violet</p>';
    						break;
     
    					default:
    					   echo '<p>Inconnu</p>';
     
     
    				 }
    			$i++;
    			}	
    	}
     
    echo '<h1>Sans while</h1>';
    	foreach ($data_json_obj_array['produits'] as $val_color) 
    		{
    			switch($val_color['color'])
    			 {
    				 case 'red' :
    					echo '<p>Rouge</p>';
    					break;
     
    				case 'orange' :
    					echo '<p>Orange</p>';
    					break;
     
    				case 'purple' :
    					echo '<p>Violet</p>';
    					break;
     
    				default:
    				   echo '<p>Inconnu</p>';
     
     
    			 }
    	}

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    En fait c'est while OU foreach car le foreach fait exactement la même chose que ton while avec compteur. Dès que tu sors de ton foreach, tu vas atteindre le bout du tableau, donc le count sera égal au compteur et donc tu sortiras de la boucle (et tu n'auras fait qu'un tour dedans).

    Quant à choisir entre les deux, la seule et unique façon de parcourir proprement entièrement (ou non) un tableau est d'utiliser la syntaxe foreach.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    parce que ton 1er code est... faux !

    Il ne fait... qu'un tour de while *(!), car tu as mis le $i++ dans le foreach.
    Ce qui fait que $i prend la valeur 6 AVANT de revenir à la condition du while ($i<6).

    (*mets des echo dans le code; pour t'en convaincre).

    Inverse :
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			}	
    		$i++; // en dehors du foreach !
    	}
    Là, ce n'est plus la même chanson.

    Une 3ème façon (correcte) est :
    Code php : 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
    $compteur = count($data_json_obj_array['produits'] );
    for ($i=0; $i < $compteur; $i++)
    {
    	switch($data_json_obj_array['produits'][$i]['color'])
    	{
    		case 'red' :
    		echo '<p>Rouge</p>';
    		break;
     
    		case 'orange' :
    		echo '<p>Orange</p>';
    		break;
     
    		case 'purple' :
    		echo '<p>Violet</p>';
    		break;
     
    		default:
    		echo '<p>Inconnu</p>';
    	}
    }

    CELA DIT, la 2ème solution que tu donnes est correcte, et, à mon avis, la meilleure.
    Dernière modification par Invité ; 05/10/2015 à 16h15.

  4. #4
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Merci avec vos messages, c'est plus claire !

  5. #5
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Merci Spartacusply,

    Donc je dois utiliser foreach :
    Citation Envoyé par Spartacusply Voir le message
    Quant à choisir entre les deux, la seule et unique façon de parcourir proprement entièrement (ou non) un tableau est d'utiliser la syntaxe foreach.
    Parce que je vais parcourir le tableau, à une seule fois...
    Je n'ai pas besoin d'utiliser while (en plus j'ai mis à mauvais endroit ma variable $i++

    Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    La syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i=0; $i < $compteur; $i++)
    est valable aussi.


    Mais avec foreach, on va plus loin...

  7. #7
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Merci jreaux62, pour cette explication bien détaillée.



    Citation Envoyé par jreaux62 Voir le message
    Bonjour,

    parce que ton 1er code est... faux !

    Il ne fait... qu'un tour de while *(!), car tu as mis le $i++ dans le foreach.
    Ce qui fait que $i prend la valeur 6 AVANT de revenir à la condition du while ($i<6).
    J'ai compris en déplaçant mon $i++ à bon endroit dans ma boucle while :

    Donc dans mon exemple, le tableau est parcouru 6 fois puisqu'il y a 6 produits!



    Citation Envoyé par jreaux62 Voir le message

    Une 3ème façon (correcte) est :
    Code php : 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
    $compteur = count($data_json_obj_array['produits'] );
    for ($i=0; $i < $compteur; $i++)
    {
    	switch($data_json_obj_array['produits'][$i]['color'])
    	{
    		case 'red' :
    		echo '<p>Rouge</p>';
    		break;
     
    		case 'orange' :
    		echo '<p>Orange</p>';
    		break;
     
    		case 'purple' :
    		echo '<p>Violet</p>';
    		break;
     
    		default:
    		echo '<p>Inconnu</p>';
    	}
    }
    Merci pour ton exemple avec for...

    Je me demande quel est meilleure solution entre la boucle foreach ou boucle for pour ma data ?

    Citation Envoyé par jreaux62 Voir le message
    CELA DIT, la 2ème solution que tu donnes est correcte, et, à mon avis, la meilleure.

  8. #8
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Merci encore pour vos explications et je vais utiliser la 2e (foreach) exemple...

    bonne journée

  9. #9
    Invité
    Invité(e)
    Par défaut
    La question n'était pas : "Laquelle utiliser ? Laquelle rejeter ?"

    La bonne question est : "QUAND utiliser l'une ? QUAND utiliser l'autre ?"
    Réponse :
    • il est parfois plus simple/lisible d'utiliser for()
    • mais généralement, on utilise foreach()

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    question épurage, ton code se résume à quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $colors = [
        'red'    => 'Rouge',
        'orange' => 'Orange',
        'purple' => 'Violet'
    ];
     
    foreach ($data_json_obj_array['produits'] as $v)
    {
        echo '<p>', isset($colors[$v['color']]) ? $colors[$v['color']] : 'Inconnu', '</p>';
    }

  11. #11
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Merci encore

    Bonne journée

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

Discussions similaires

  1. [JSTL] Lire une ArrayList dans une JSP en utilisant ForEach
    Par ScReeeN dans le forum Taglibs
    Réponses: 7
    Dernier message: 23/07/2010, 11h46
  2. Boucle sans fin avec while..do
    Par chahinerue6 dans le forum Langage
    Réponses: 13
    Dernier message: 24/03/2010, 18h50
  3. Boucle while ou for utilisée avec lame pour les mp3
    Par figarojuju dans le forum Linux
    Réponses: 6
    Dernier message: 09/09/2008, 20h51
  4. Réponses: 5
    Dernier message: 29/03/2007, 00h08
  5. [MySQL] Aide pour un script utilisant foreach
    Par nicoreims dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/08/2006, 16h36

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