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 496
    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 496
    Points : 12 596
    Points
    12 596
    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 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    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 496
    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 496
    Points : 12 596
    Points
    12 596
    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 496
    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 496
    Points : 12 596
    Points
    12 596
    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 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    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
    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]

  9. #9
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    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 496
    Points : 12 596
    Points
    12 596
    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 496
    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 496
    Points : 12 596
    Points
    12 596
    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 496
    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 496
    Points : 12 596
    Points
    12 596
    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 496
    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 496
    Points : 12 596
    Points
    12 596
    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