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 :

Boucles while imbriquées [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 100
    Points : 64
    Points
    64
    Par défaut Boucles while imbriquées
    Salut à tous,

    j'étais venu demander de l'aide ici même la semaine dernière pour une requete sql. Aujourd'hui je reviens avec un autre problème sur cette même table. Je resitue.

    J'ai une table structurée comme ceci
    Code sql : 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
     
    CREATE TABLE IF NOT EXISTS `categories` (
      `Id_categorie` smallint(255) unsigned NOT NULL AUTO_INCREMENT,
      `nom` varchar(255) NOT NULL,
      `parent` smallint(255) unsigned NOT NULL,
      PRIMARY KEY (`Id_categorie`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
     
    --
    -- Contenu de la table `categories`
    --
     
    INSERT INTO `categories` (`Id_categorie`, `nom`, `parent`) VALUES
    (1, 'Actus', 0),
    (2, 'Commune', 1),
    (3, 'Informatique', 1),
    (4, 'Brèves', 1),
    (5, 'Chantiers', 2),
    (6, 'Voirie', 2)
    Chaque catégorie peut avoir des enfants, avec un nombre illimité de niveau (chaque enfant peut avoir un enfant qui peut avoir un enfant etc)

    Je cherche à faire un boucle qui me récupérer tous les enfants d'un catégorie. Par exemple, je veux que ma boucle m'affiche tous les enfants de Actus sous cette forme la

    • Actus
      • Commune
        • Chantiers
        • Voirie

      • Informatique
      • Brèves



    Sachant que la catégorie chantier peut elle même avoir des enfants..

    J'imagine qu'il y a moyen de faire ca avec des boucles while, mais impossible d'écrire cette boucle, je dois pas prendre le problème par le bon coté.

    Est-ce que certains d'entre vous voient bien ce que je veux faire et auraient une solution ? Peut-être en modifiant la structure de ma table ?

    Merci

  2. #2
    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 : 48
    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,

    Pas de solution "simple" avec des arbres de profondeur infinie, un peu de lecture : ici

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 100
    Points : 64
    Points
    64
    Par défaut
    Whaou, effectivement, rien de très simple. Je me doutais bien que je n'étais pas le premier à plancher sur ce genre de truc. Bon ben merci pour le lien, je vais voir ce que je peux en tirer et si j'ai envie de partir la dedans..

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2004
    Messages : 108
    Points : 175
    Points
    175
    Par défaut
    Bonjour,

    Après tu peux essayer de faire ce processus de création d'arborescence en dehors de ta requête sql. A moins que tu es une contrainte à ce niveau là ?

    Cela me paraitrais plus simple, même si cela rajoute un peu de calcul dans ton code (enfin à priori tu ne vas pas afficher plusieurs milliers de catégorie ).

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 100
    Points : 64
    Points
    64
    Par défaut
    Salut,

    Non aucune contrainte pour faire en dehors de ma requete SQL, c'étais d'ailleurs dans cette voie la que je cherchais.

    Et non y'aura pas des milliers de catégories, si j'arrive à la vingtaine ce sera déjà un beau score !

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2004
    Messages : 108
    Points : 175
    Points
    175
    Par défaut
    Bon donc dans ce cas là tu dois pouvoir t'en sortir avec une petite fonction récursive .
    Afin d'éviter de faire autant de requête que de catégorie fille je te conseillerais avant tout de mettre toutes tes catégorie dans un tableau avec pour clé le champ parent (ce qui veut dire que ce sera un tableau multi-dimensionnelles car chaque catégorie parent peut avoir plusieurs fille).


    Ensuite voici une idée de ce que tu pourrais faire :
    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
    22
    23
    24
    25
     
    /**
     * $arr array Le tableau contenant toute les données
     * $idCat integer L'id de départ de la catégorie voulue
     */
    function getAllTree($arr, $idCat = 0)
    {
        $listeTupleOrga = array();
        $listeTuple = array();
     
        //Récupèration des tuples fils
        if (isset($arr[$idCat])) $listeTuple = $arr[$idCat];
     
        //On boucle sur les fils
        foreach ($listeTuple as $tuple) {
     
    	 //On ajoute chaque fils dans le tableau final et on rappelle la fonction getAllTree pour ce fils.
             $listeTupleOrga[$tuple['Id_categorie']] = array($tuple, getAllTree($tuple['Id_categorie']));
        }
     
        return $listeTupleOrga;
    }
     
    $monTableau = array(...);
    $listeTupleOrga = getAllTree($monTableau, 1);

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 100
    Points : 64
    Points
    64
    Par défaut
    Salut TERRA126,

    ok, bon je ne suis pas sur d'avoir tout compris. Pour le tableau qui doit contenir toutes mes catégories (et je pense que c'est la que ca peche..), j'ai créé ca, en suivant mon exemple:
    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
     
    /*
    idCat,Nom,id_parent
    (1, 'Actus', 0),
    (2, 'Commune', 1),
    (3, 'Informatique', 1),
    (4, 'Brèves', 1),
    (5, 'Chantiers', 2),
    (6, 'Voirie', 2),
    (7, 'RD', 6),
    (8, 'RN', 6),
    (9, 'RD_13', 8),
    (10, 'RD_83', 8),
    (11, 'Enquete', 0)
     */
     
    $monTableau =array();
    $monTableau[0]="Actus";
    $monTableau[1][2]="Commune";
    $monTableau[2][5]="Chantiers";
    $monTableau[2][6]="Voirie";
    $monTableau[1][3]="Informatique";
    $monTableau[1][4]="Brèves";
    $monTableau[2][7]="RD";
    $monTableau[2][8]="RN";
    $monTableau[8][9]="RD_13";
    $monTableau[8][10]="RD_83";
    $monTableau[0]="Enquete";
    Mais la le retour de la fonction n'est pas terrible

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2004
    Messages : 108
    Points : 175
    Points
    175
    Par défaut
    Voici un code un peu modifié pour éviter d'avoir des tableau vide. De plus j'ai aussi afficher directement des listes pour te donner une représentation de ce que contient le tableau de sortie.

    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
    22
    23
    24
    25
    26
    27
    28
    29
     
    /**
     * $arr array Le tableau contenant toute les données
     * $idCat integer L'id de départ de la catégorie voulue
     */
    function getAllTree($arr, $idCat = 0)
    {
    	echo '<ul>';
        $listeTupleOrga = array();
        $listeTuple = array();
     
        //Récupèration des tuples fils
        if (isset($arr[$idCat])) $listeTuple = $arr[$idCat];
     
        //On boucle sur les fils
        foreach ($listeTuple as $tuple) {
     
    	 //On ajoute chaque fils dans le tableau final et on rappelle la fonction getAllTree pour ce fils.
    	     echo '<li>'.$tuple[0].'</li>';
     
    		$fils = getAllTree($arr, $tuple['Id_categorie']);
    		if (count($fils) > 0)
    			$listeTupleOrga[] = array($tuple, $fils);
    		else
    			$listeTupleOrga[] = array($tuple);
        }
    	echo '</ul>';
        return $listeTupleOrga;
    }

    D'ailleurs si cette méthode pour afficher les listes te convient tu peux ne pas demander de valeur de retour. Cela deviendrais alors
    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
    /**
     * $arr array Le tableau contenant toute les données
     * $idCat integer L'id de départ de la catégorie voulue
     */
    function getAllTree($arr, $idCat = 0)
    {
       //Récupèration des tuples fils
        $listeTuple = array();
    	if (isset($arr[$idCat])) {
    		$listeTuple = $arr[$idCat];
    		echo '<ul>';		
    		//On boucle sur les fils
    		foreach ($listeTuple as $tuple) {
    			 echo '<li>'.$tuple['nom'].'</li>'; //On affiche la catégorie en cours
    			$fils = getAllTree($arr, $tuple['Id_categorie']); //On passe au niveau inférieur si présent
    		}
    		echo '</ul>';
    	}
    }
     
    getAllTree($t, 0);

    Le tableau d'entrée d'après tes données devrait ressembler à cela
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $t[0][] = array('Id_categorie' => 1, 'nom' => 'Actus', 'parent' => 0);
    $t[1][] = array('Id_categorie' =>2, 'nom' => 'Commune', 'parent' => 1);
    $t[1][] = array('Id_categorie' =>3, 'nom' => 'Informatique', 'parent' => 1);
    $t[1][] = array('Id_categorie' =>4, 'nom' => 'Brèves', 'parent' => 1);
    $t[2][] = array('Id_categorie' =>5, 'nom' => 'Chantiers', 'parent' => 2);
    $t[2][] = array('Id_categorie' =>6, 'nom' => 'Voirie', 'parent' => 2);
    $t[6][] = array('Id_categorie' =>7, 'nom' => 'RD', 'parent' => 6);
    $t[6][] = array('Id_categorie' =>8, 'nom' => 'RN', 'parent' => 6);
    $t[8][] = array('Id_categorie' =>9, 'nom' => 'RD_13', 'parent' => 8);
    $t[8][] = array('Id_categorie' =>10, 'nom' => 'RD_83', 'parent' => 8);
    $t[0][] = array('Id_categorie' =>11, 'nom' => 'Enquete', 'parent' => 0);

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 100
    Points : 64
    Points
    64
    Par défaut
    Ha, yes ca fonctionne au top, merci

    Je pense même qu'on peut alléger la tableau en supprimant le champ 'parent' non ?

    J'avais jamais vu, jamais eu besoin de fonction récursive. Dans ce cas la c'est vraiment parfait.

  10. #10
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2004
    Messages : 108
    Points : 175
    Points
    175
    Par défaut
    Content que cela fonctionne te convienne. Et tu peux en effet supprimer le champ parent, il est seulement nécessaire en tant que clé (tu dois tout de même le récupérer dans ta requête sql donc ).

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 100
    Points : 64
    Points
    64
    Par défaut
    Oui oui, je comprends bien. Je crois que je vais m'en servir pour gérer mon organigramme aussi

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

Discussions similaires

  1. Boucle while imbriqué, problème de renvoi de valeur
    Par biche1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/09/2008, 17h09
  2. Boucle while imbriquées
    Par quentincabo dans le forum VB.NET
    Réponses: 14
    Dernier message: 04/04/2008, 11h29
  3. problème d'execution de 2 boucles while imbriquées
    Par missyos dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 17/03/2008, 14h01
  4. [MySQL] Boucle while imbriqué
    Par agbononamour dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 31/05/2007, 18h09
  5. [Tableaux] Boucle while imbriquer
    Par Le-Cortex dans le forum Langage
    Réponses: 11
    Dernier message: 09/09/2005, 14h22

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