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 :

Encapsulations de boucles


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 264
    Par défaut Encapsulations de boucles
    Bonjour,

    C'est pas vraiment une question, mais le sujet est interressant...
    Généralement on dit que faire 2 boucles while est déconseillé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(..)
    {
      while(..)
      {
      }
    }
    pourtant on trouve des cas extrêmes, exemple..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for($a=0;$a<10;$a++){
        for($b=0;$b<10;$b++){
              for($c=0;$c<10;$c++){
                  for($d=0;$d<10;$d++){
                    echo $a.$b.$c.$d.", ";
                  }
               }
          }
    }
    ou encore...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $arr = array(12,18,24,36);
    foreach($arr as $num) 
      foreach($arr as $inner_num) 
        foreach($arr as $last_num) 
          echo "$num-$inner_num-$last_num\n";
    donc pourquoi pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while(..)
    {
      while(..)
      {
        while(..)
        {
           while(..)
          {
          }
        }
      }
    }

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    en fait le while à la différence du foreach ou du for peut travailler sur le résultats d'un tests conditionnelle.
    J'entends par là que tu peux faire :

    TANT QUE je dis : continues
    tu continues de tourner
    FIN TANT QUE

    Plus proche du php on pourrais imaginer cela :
    while (1 == 1 ){ echo "i'm running"; }

    Et ici c'est une boucle infinie. Problème qui peut être assez galère à régler.
    Donc, dans les boucles, il faut toujours avoir une solution de sortie, tout particulièrement pour les while qui peuvent être traître.

    Le problème ne se pose pas trop sur le foreach car on travail sur un iterateur qui bien souvent possède un début et une fin. ( Même si j'ai déjà vu des interfaces de infiniteIterator.... )
    Qd aux boucles for, les problèmes possible sont généralement assez flagrant.

    De toute façon ce ne sont que des recommandations. Rien ne t'empeche d'utiliser do{}while(); si cela te chantes et convient à la résolution ton problème.

    Dans les bonnes pratiques à adopter en général on conseille de découper son problème en plusieurs sous problèmes plus simples.
    Et typiquement ce genre d'enchevêtrement de boucle dénote d'un découpage trop succinct.

    a plus

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 264
    Par défaut
    merci pour ces explications, j'ai donc découpé le pb comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    white (instruction...)
    {
       foreach (instruction) {
       }
    }
    reste à dire que l'encapsulation de boucle-while est parfaitement fesable et il existe des instructions comme endwhile pour mettre fin à une boucle, enfin tout cela dépend bien sûr du pb rencontré...

    exemple identique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    $arr = array("un", "deux", "trois");
    reset($arr);
    while (list(, $value) = each($arr)) {
       echo "Valeur : $value<br />\n";
    }
     
    foreach ($arr as $value) {
       echo "Valeur : $value<br />\n";
    }
    ?>

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Citation Envoyé par ctrl+z Voir le message
    merci pour ces explications, j'ai donc découpé le pb comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    white (instruction...)
    {
       foreach (instruction) {
       }
    }
    reste à dire que l'encapsulation de boucle-while est parfaitement fesable et il existe des instructions comme endwhile pour mettre fin à une boucle, enfin tout cela dépend bien sûr du pb rencontré...

    exemple identique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    $arr = array("un", "deux", "trois");
    reset($arr);
    while (list(, $value) = each($arr)) {
       echo "Valeur : $value<br />\n";
    }
     
    foreach ($arr as $value) {
       echo "Valeur : $value<br />\n";
    }
    ?>
    Connaissais pas ce petit endwhile ! Un équivalent du break; en moins générique :\

    a plus

Discussions similaires

  1. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  2. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  3. Sortir d'un progamme qui boucle ou qui refresh
    Par mikevador02 dans le forum C
    Réponses: 12
    Dernier message: 14/12/2002, 09h38
  4. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58
  5. Réponses: 2
    Dernier message: 29/05/2002, 20h43

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