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 :

Parcourir plusieurs fois une boucle foreach


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut Parcourir plusieurs fois une boucle foreach
    Bonjour,

    Je commence directement avec un exemple, c'est plus simple

    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
    $test1=array(1,1);
    $test2=array(2,2);
    $test3=array(3,3);
     
    foreach ($test1 as $res1){
     
       echo $res1.'<br>';
     
        foreach ($test2 as $res2){
     
          echo $res2.'<br>';
     
            foreach ($test3 as $res3){
     
              echo $res3.'<br>';
     
            }
        }
    }
    La raison pour laquelle j'utilise ces 3 boucles, c'est pour eviter la récursivite.
    Comme vous voyez, les 3 boucles sont presque similaires.
    Donc, pour eviter la redondance du code jai pensé à faire une boucle for du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for ($i=1; $i<=3 ;$i++){
     
     foreach ($test.$i as $res.$i}){
     
            echo $res.$i.'<br>'; 
    }// fin de la boucle for pour les foreach
     
    for ($i=1; $i<=3 ;$i++){
     
       }// fermer le premier foreach
      }//fermer le deuxième foreach
     }//fermer le deuxième foreach
    }// fin de la boucle for pour fermer les 3 foreach
    Je sais que ca ne marche pas, mais vous voyez ce que je veux faire.

    Merci

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Et pourquoi tu ne veux pas faire une fonction recursive ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Et pourquoi tu ne veux pas faire une fonction recursive ?
    Parce que j'aurais beaucoup de donnés à traiter, et ce n'est pas une bonne idée avec la récursivité. D'ailleurs je sais combien de parcours je dois faire:5.

    Dans l'exemple j'ai mis 3 pour faire court.

    Merci

  4. #4
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut
    Bonjour,

    je pense qu'il faut utiliser les $$ comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for ($i=1; $i<=3 ;$i++){
     $un_test='test'.$i;
     foreach ($$un_test as $res)
             echo $res.$i.'<br>'; 
    }// fin de la boucle for pour les foreach

  5. #5
    Membre régulier Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Points : 97
    Points
    97
    Par défaut
    pour eviter la récursivite.
    C'est triste ce que tu dis

    Dans l'espoir que tu revienne sur la bonne route, voici la fonction récursive Tested & Approved.

    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
     
    $test1=array(1,1);
    $test2=array(2,2);
    $test3=array(3,3);
     
    processArray(array($test1, $test2, $test3));
     
    function processArray($args) {
     
      if (count($args)) {
     
        $arg_main = array_shift($args);
     
        foreach ($arg_main as $val) {
     
          echo $val.'<br>';
          processArray($args);
        }
      }
    }

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par daajack Voir le message
    C'est triste ce que tu dis

    Dans l'espoir que tu revienne sur la bonne route, voici la fonction récursive Tested & Approved.

    [/CODE]
    Lol pourquoi c'est triste.

    Oui je sais que c'est plus court,plus facile et plus propre avec une fonction récursive, mais c'est lourd en execution, surtout avec la grande quantité de données que j'aurais à manipuler plus tard.

    Mais merci comme même

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par gui80 Voir le message
    Bonjour,

    je pense qu'il faut utiliser les $$ comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for ($i=1; $i<=3 ;$i++){
     $un_test='test'.$i;
     foreach ($$un_test as $res)
             echo $res.$i.'<br>'; 
    }// fin de la boucle for pour les foreach
    Ca ne donne pas le bon résultat.
    Le résultat est différent.

    Merci comme même.

  8. #8
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par persia Voir le message
    Lol pourquoi c'est triste.

    Oui je sais que c'est plus court,plus facile et plus propre avec une fonction récursive, mais c'est lourd en execution, surtout avec la grande quantité de données que j'aurais à manipuler plus tard.

    Mais merci comme même
    Pas plus lourd que de le faire sans récursivité

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Je cherche tout simplement à le faire comme suit car ca serait aussi bien adapté à mes besoins:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for ($i=1; $i<=3 ;$i++){
     $un_test='test'.$i;
     foreach ($$un_test as $res)
             echo $res.$i.'<br>'; 
    }// fin de la boucle for pour les foreach
    Il manque juste un petit détail pour que ca fonctionne bien.

    Merci

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    En fait, voilà ce que je veux vraiment automatiser:

    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
    $test1=array(1,1);
     
    foreach ($test1 as $res1){
     
        $premier= $res1; 
        echo $premier;
     
        $test2=array(2,2); 
     
        foreach ($test2 as $res2){
     
             $deuxieme=$res2;     
             echo $deuxieme;
     
             $test3=array(3,3);
     
             foreach ($test3 as $res3){
     
              $troisieme=$res3;     
              echo $troisieme;
     
            }
        }
    }
    Si quelqu'un à une idée, je suis preneur, même si c'est récursive lol.

    J'espère que j'étais clair.

    Merci

  11. #11
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut


    Sinon, le plus simple, c'est que tu nous fasses un exemple avec les éléments de départ, et le résultat escompté, tout ceci sans code ni algorithme, que des phrases, car là, je ne suis pas sûr de comprendre à présent ce que tu désires.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par gui80 Voir le message


    Sinon, le plus simple, c'est que tu nous fasses un exemple avec les éléments de départ, et le résultat escompté, tout ceci sans code ni algorithme, que des phrases, car là, je ne suis pas sûr de comprendre à présent ce que tu désires.
    Ok pas de problème,

    En fait c'est un arbre, qui contient des noeuds, des fils ,etc.

    Chaque boucle foreach représente un niveau, donc le nombre de foreach dépens du nombre de niveau. La raison pour laquelle je veux mettre une boucle foreach dans une boucle for, c'est parce que je sais combien de niveau un arbre va avoir. (le nombre de niveau est dynamique).

    Dans l'exemple jai pris en compte que le nombre de niveau est 3.

    -1
    --2
    ---3

    C'est la raison pour laquelle je veux automatiser le code précédent.

    J'espère que ca explique un peu ce que je veux faire.

    Merci

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    un autre exemple qui va peut être plus clair avec des données:
    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
     
    1234  // 1 er niveau
          2345 // 2 ème niveau
          3456 // 2 ème niveau
               3689 // 3 ème niveau
          4567 // 2 ème niveau 
     
    2345  // 1 er niveau
          5698 // 2 ème niveau
          3456  // 2 ème niveau
                5678  // 3 ème niveau
                3456  // 3 ème niveau
     
    2378 // 1 ère niveau
          5688 // 2 ème niveau

    Admettons que je veux parcourir l'arbre et compter le nombre de fois qu'on trouve le chiffre 3456.

  14. #14
    Membre régulier Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Points : 97
    Points
    97
    Par défaut
    Re,

    Je ne comprend pas pkoi tu n'as pas utilisé ma fonction, elle correspond à ton problème...

    La revoici avec qq adaptations :

    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
    $test = Array(
     
      'A' => Array(
        'I' => Array(1, 2, 3),
        'II' => Array(4, 5, 6),
        'III' => Array(5, 6, 7)),
      'B' => Array(
        'Animaux' => Array(
          'chien' => Array(
            'races' => Array('teckel', 'cocker', 'berger allemand'),
            'taille' => Array('micro', 'normal', 'monstre')),
          'chat' => Array(
            'noms' => Array('mitsi', 'croquette', 'chaussette'),
            'types' => Array('gouttière', 'appartement')))),
      'C' => Array(
        'Langages' => Array('PHP','JS','Python')),
      'Hello world' => null,
    );
     
    processArray('root', $test, 0);
     
    function processArray($mainKey, $mainVals, $lvl) {
     
      echo str_repeat('-', $lvl);
     
      if (is_array($mainVals)) {
     
        echo $mainKey.' => <br/>';
        foreach ($mainVals as $key => $val) processArray($key, $val, $lvl + 1);
     
      } else echo $mainKey.' => '.$mainVals.'<br/>';
    }
    Si jamais pour ce genre de données, il y'a YAML qui est pratique.

    Voici le résultat de la fonction :
    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
    root =>
    -A =>
    --I =>
    ---0 => 1
    ---1 => 2
    ---2 => 3
    --II =>
    ---0 => 4
    ---1 => 5
    ---2 => 6
    --III =>
    ---0 => 5
    ---1 => 6
    ---2 => 7
    -B =>
    --Animaux =>
    ---chien =>
    ----races =>
    -----0 => teckel
    -----1 => cocker
    -----2 => berger allemand
    ----taille =>
    -----0 => micro
    -----1 => normal
    -----2 => monstre
    ---chat =>
    ----noms =>
    -----0 => mitsi
    -----1 => croquette
    -----2 => chaussette
    ----types =>
    -----0 => gouttière
    -----1 => appartement
    -C =>
    --Langages =>
    ---0 => PHP
    ---1 => JS
    ---2 => Python
    -Hello world =>

  15. #15
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut
    Bravo à daajack, c'est encore plus optimisé que le 1er code.

    Ta structure est donc un arbre général, je me suis amusé à le mettre en algo pour bien comprendre la logique.
    Si tu souhaites voir la forme algo, je la mettrai ici. A toi de dire.

  16. #16
    Membre régulier Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Points : 97
    Points
    97
    Par défaut
    Si tu souhaites voir la forme algo, je la mettrai ici. A toi de dire.
    Moi ça m'intéresse

  17. #17
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut
    Bien chef.

    Balayage de l'arbre général.
    En gros on a des blocs de tableaux, chaque indice a un fils gauche et un fils droit. On cherche toujours le fils gauche de l'indice du tableau où l'on se situe, pour aller l'explorer, quand il n'y en a plus, on affiche la valeur, on passe à l'indice suivant du tableau pour appliquer le même raisonnement sauf si on est en fin du tableau, on scrute le fils droit pour appliquer le même raisonnement.

    Voici, en espérant que je n'ai pas fait de faute :
    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
     
    Procédure Lire_Arbre(tableau, ind)
    Paramètres : tableau : tableau de x élément, ind : entier
     
    Si(tableau<>Vide et ind<=taille(tableau)) Alors
       Si(tableau[ind].fils_gauche=Vide) Alors
          Afficher(tableau[ind]," , ")
          Si((ind+1)>taille(tableau)) Alors
             Lire_Arbre(tableau[ind].fils_d,0)
          Sinon
             Lire_Arbre(tableau,ind+1)
          Fin Si
       Sinon
          Lire_Arbre(tableau[ind].fils_g,0)
          Afficher(tableau[ind])
          Si((ind+1)>taille(tableau)) Alors
             Lire_Arbre(tableau[ind].fils_d,0)
          Sinon
             Lire_Arbre(tableau,ind+1)
          Fin Si
       Fin Si
     
    Fin Procédure

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Merci à vous: daajack et gui80

    Vous etes une équipe génial.

    Bon travail et merci encore.

  19. #19
    Membre régulier Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Points : 97
    Points
    97
    Par défaut
    Balayage de l'arbre général.
    En gros on a des blocs de tableaux, chaque indice a un fils gauche et un fils droit...
    Je vois bien le truc, mais quitte à passer pour un con, ça sert à quoi ce pseudo-code ? Pour faire du bas-niveau ?

  20. #20
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut
    , c'est de l'algorithme.
    Normalement, avant de coder dans n'importe quel langage, tu fais un algorithme.
    Ensuite, tu peux l'optimiser avec les méthodes propres au langage de programmation que tu utilises pour l'appliquer. Ainsi, tu as fait en PHP la même chose mais de manière plus courte.

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

Discussions similaires

  1. Parcourir plusieurs tableaux dans une boucle foreach
    Par snorky94 dans le forum Langage
    Réponses: 8
    Dernier message: 06/02/2014, 12h34
  2. Réponses: 3
    Dernier message: 15/05/2006, 19h04
  3. [Struts javascript] ouvrir plusieurs fois une popup
    Par jc_romeo dans le forum Struts 1
    Réponses: 2
    Dernier message: 02/03/2006, 09h36
  4. Réponses: 5
    Dernier message: 05/01/2006, 18h43
  5. [MySQL] Parcourir plusieurs fois le résultat de ma requête
    Par borgfabr dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/12/2005, 09h54

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