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 :

Parcours Recursif de tableau [PHP 7]


Sujet :

Langage PHP

  1. #1
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut Parcours Recursif de tableau
    Bonjour, je dispose d'un tableau (que je ne connais pas à l'avance) et je dois le parcourir de façon recursif.
    Je dois afficher le parcours sous forme parent/fille/petite-fille..........

    J'y suis presque, mais le nez dans le guidon je n'arrive pas à avoir mon affichage.
    Voici ce que je fais

    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
     
      $tab = [
                "Juridique" => [
                    "Avocat" => null,
                    "Actes d'achat" => [
                        "Actes" => null,
                        "Compromis" => null,
                        "Option" => null,
                        "Titres" => null,
                    ],
                    "Baux existant" => null,
                    "Cadastre" => [
                        "Cadastre" => null,
                        "Cadastre vertical" => null
                    ],
                    "Contrats" => null,
                    "Constitution" => null,
                    "Décision Permis" => null,
                    "TVA" => null
                ],
                "Développement" => [
                    "Info Générale" => [
                        "Infos" => null,
                        "Photos" => null
                    ],
                    "Archi" => [
                        "Avant Projet" => null,
                        "Esquisse volumétrique" => null
                    ],
                    "PM / AMO" => null,
                    "Administrations" => [
                        "Collège" => null,
                        "Commune" => null,
                        "Urbanisme" => null
                    ],
                    "Pré Études" => [
                        "Amiante" => null,
                        "BREEAM" => null,
                        "Dépollution" => null,
                        "Études de sol" => null,
                        "Essais de sol" => null,
                        "Géomètre" => null,
                        "Ores" => null,
                        "PEB" => null,
                        "Pompiers" => null                    
                    ],
                    "Programme" => null
                ]
            ];
    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
     
            echo '<pre>' . PHP_EOL;
            foreach(walkTree($tab) as $node) {
     
                echo str_repeat('  ', $node['depth']) . '  ' .$node['name'] . PHP_EOL;
               }
            echo '</pre>' . PHP_EOL;
     
     
     
        function walkTree($tree, $depth = 0)
        {
            foreach ($tree as $key => $value) {
                yield ['depth' => $depth, 'name' => $key];
                if (is_array($value)) {
                    yield from walkTree($value, $depth + 1);
                }
            }
        }

    Auriez-vous une piste ?

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 331
    Points : 15 674
    Points
    15 674
    Par défaut
    qu'affiche ce code quand vous le testez seul (et avec l'affichage des erreurs activé) ?

  3. #3
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    il n'y a aucune erreur, il m'affiche le parcours de l'arbre :

    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
     
      Juridique
        Avocat
        Actes d'achat
          Actes
          Compromis
          Option
          Titres
        Baux existant
        Cadastre
          Cadastre
          Cadastre vertical
        Contrats
        Constitution
        Décision Permis
        TVA
      Développement
        Info Générale
          Infos
          Photos
        Archi
          Avant Projet
          Esquisse volumétrique
        PM / AMO
        Administrations
          Collège
          Commune
          Urbanisme
        Pré Études
          Amiante
          BREEAM
          Dépollution
          Études de sol
          Essais de sol
          Géomètre
          Ores
          PEB
          Pompiers
          SPW
          TS
    Hors moi je voudrais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      Juridique
      Juridique/Avocat
      Juridique/Avocat/Actes d'achat
      Juridique/Avocat/Actes d'achat/Actes
      Juridique/Avocat/Actes d'achat/Compromis
    .....
       Développement
       Développement/Info Générale
       Développement/Info Générale/Infos
       Développement/Info Générale/Photos

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

    j'ai du mal à croire que ton code fonctionne :
    • il y a une accolade fermante en trop,
    • et 2 fois $walkTree au lieu de walkTree...

  5. #5
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Et bien si, en fait cela se trouve dans une classe , j'ai juste fais des copier coller et enlever les this.....je corrige (c'est fais).

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 331
    Points : 15 674
    Points
    15 674
    Par défaut
    je parlais d'erreur parce que le code du 1er message produisait une erreur de variable indéfinie pour $walkTree.

    pour un affichage avec les parents, je ferais plutôt 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
    19
    20
    echo '<pre>' . PHP_EOL;
    affichageArbre($tab, "");
    echo '</pre>' . PHP_EOL;
     
     
    function affichageArbre(array $element, $parent) {
     
    	$separateur = " | ";
     
    	foreach ($element as $cle => $enfant) {
     
    		if (!is_array($enfant)) {
    			echo "$parent$cle" . PHP_EOL;
    		} else {
    			affichageArbre($enfant, "$parent$cle$separateur");
    		}
     
    	}
     
    }

  7. #7
    Invité
    Invité(e)
    Par défaut
    Moi, je suis arrivé à ça : (en adaptant le script initial)
    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
    	echo '<pre>' . PHP_EOL;
    	foreach(walkTree($tab) as $node) {
     
    		echo str_repeat('  ', $node['depth']) . '  ' .$node['root'] . $node['name'] . PHP_EOL;
    	   }
    	echo '</pre>' . PHP_EOL;
     
        function walkTree($tree, $depth = 0, $root = '')
        {
            foreach ($tree as $key => $value) {
    			yield ['depth' => $depth, 'name' => $key, 'root' => ((!empty($root))? $root.'/':'')];
                if (is_array($value)) {
                    yield from walkTree($value, $depth + 1, ((!empty($root))? $root.'/':'').$key);
                }
            }
        }
    Ce qui donne :
    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
      Juridique
        Juridique/Avocat
        Juridique/Actes d'achat
          Juridique/Actes d'achat/Actes
          Juridique/Actes d'achat/Compromis
          Juridique/Actes d'achat/Option
          Juridique/Actes d'achat/Titres
        Juridique/Baux existant
        Juridique/Cadastre
          Juridique/Cadastre/Cadastre
          Juridique/Cadastre/Cadastre vertical
        Juridique/Contrats
        Juridique/Constitution
        Juridique/Décision Permis
        Juridique/TVA
      Développement
        Développement/Info Générale
          Développement/Info Générale/Infos
          Développement/Info Générale/Photos
        Développement/Archi
          Développement/Archi/Avant Projet
          Développement/Archi/Esquisse volumétrique
        Développement/PM / AMO
        Développement/Administrations
          Développement/Administrations/Collège
          Développement/Administrations/Commune
          Développement/Administrations/Urbanisme
        Développement/Pré Études
          Développement/Pré Études/Amiante
          Développement/Pré Études/BREEAM
          Développement/Pré Études/Dépollution
          Développement/Pré Études/Études de sol
          Développement/Pré Études/Essais de sol
          Développement/Pré Études/Géomètre
          Développement/Pré Études/Ores
          Développement/Pré Études/PEB
          Développement/Pré Études/Pompiers
        Développement/0
    Masi le code de mathieu est drôlement plus efficace !

  8. #8
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Très joli usage des générateurs. Je rajouterais juste le chemin du niveau précédent dans la fonction. Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function walkTree($tree, $depth = 0, $parentPath = "")
        {
            foreach ($tree as $key => $value) {
                $path = $parentPath.$key;
                yield ['depth' => $depth, 'name' => $path];
                if (is_array($value)) {
                    yield from walkTree($value, $depth + 1, $path.'/');
                }
            }
        }
    EDIT : le code de mathieu a l'air efficace, mais on perd les générateurs Le code de jreaux est très proche du mien, mais je crois que tu t'es pris la tête avec les chemins

  9. #9
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Vous êtes juste parfait

    Je modifie juste celui de @jreaux62 , car il prend en compte le parents

    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
     
    echo '<pre>' . PHP_EOL;
    foreach (walkTree($tab) as $node) {
     
        echo $node['root'] . $node['name'] . PHP_EOL;
    }
    echo '</pre>' . PHP_EOL;
     
    function walkTree($tree, $root = '')
    {
        foreach ($tree as $key => $value) {
            yield ['name' => $key, 'root' => ((!empty($root)) ? $root . '/' : '')];
            if (is_array($value)) {
                yield from walkTree($value,((!empty($root)) ? $root . '/' : '') . $key);
            }
        }
    }

  10. #10
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Merci @Celira, effectivement plus simple.

    Vous m'avez aidé, à un point que vous savez pas

  11. #11
    Invité
    Invité(e)
    Par défaut
    Moi qui pensais avoir le prix de la "plus grosse usine à gaz" !
    (c'était un premier jet.)

    Celira en a donné une version factorisée/optimisée.

  12. #12
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Et donc la version finalisé :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function walkTree($tree, $parentPath = null)
    {
        foreach ($tree as $key => $value) {
            $path = $parentPath . $key;
            yield ['name' => $path];
            if (is_array($value)) {
                yield from walkTree($value, $path . '/');
            }
        }
    }
    Encore merci à vous.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Alors, même pas de pour les participants ?


    Cela dit, il semble y avoir un petit défaut : le dernier n'est pas listé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Développement/Programme
    Dans l'array, il est indiqué :
    Il faut mettre

  14. #14
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Vi, j'avais vu...vu

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

Discussions similaires

  1. [MySQL] Parcours d'un tableau et suppression des entrées
    Par padoberg dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/07/2006, 13h41
  2. probleme de parcours d'un tableau
    Par rodriguez_du35 dans le forum Langage
    Réponses: 4
    Dernier message: 29/05/2006, 09h16
  3. parcours d un tableau de l interface graphique
    Par natasha84 dans le forum MFC
    Réponses: 7
    Dernier message: 26/05/2006, 23h29
  4. Réponses: 7
    Dernier message: 10/03/2006, 19h09
  5. Parcour d un tableau dynamique
    Par harris_macken dans le forum Débuter
    Réponses: 12
    Dernier message: 24/05/2005, 22h23

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