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

Algorithmes et structures de données Discussion :

Affichage incrémenté de catégories et sous-catégories


Sujet :

Algorithmes et structures de données

  1. #1
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut Affichage incrémenté de catégories et sous-catégories
    Salut,
    je cherche à faire un affichage de catégories et sous-catégories sous cette forme :

    Cat1
    -1.1
    --1.1.1
    --1.1.2
    -1.2
    --1.2.1
    Cat2
    -2.1
    -2.2
    --2.2.1
    --2.2.2
    -2.3

    Mon problème se situe au niveau du décalage à ajouter avant les nomns de catégories. En l'occurence le nombre de "-" dans l'exemple.

    Voici comment je stocke mes informations de catégories :
    id | id_parent | name

    Et enfin voici ce que j'ai pondu pour l'instant mais je bloque, il me manque quelque chose :

    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
     
    decalage = "";
    foreach(categories as cat)	{
    	// Si la catégorie n'est pas une racine
    	if(!cat->estRacine())	{
    		// Si on a changé de parent
    		if(idParent != cat->getIdParent())	{
    			decalage .= "-";
    			idParent = cat->getIdParent();
    		}
    	}
    	// Si la catégorie est une racine
    	else	{
    		decalage = ""; // Je remet le décalage à 0
    		idParent = 0; // Ici je remets l'idParent à 0 car une catégorie racine a 0 en idParent
    	}
    	affiche decalage.cat->getName();
    En fait ceci me décale relativement comme il faut. Il y a en fait un problème car le décalage se remet à 0 uniquement si la catégorie est une racine.
    Ce qui me donne à l'affichage un truc du style :

    Cat1
    -1.1
    --1.1.1
    --1.1.2
    ---1.2
    ----1.2.1
    Cat2
    -2.1
    -2.2
    --2.2.1
    --2.2.2
    ---2.3

    Voilà si quelqu'un a une idée pour résoudre ce problème ou un tout autre algo, ca m'intéresse bien ^^
    Merci d'avance et a+
    Vive les roues en pierre

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    T'utilises la notion de parents, de racine comme pour un arbre.

    Le nombre de -, c'est simplement la profondeur de l'arbre de la racine au sommet où tu te trouves.
    Je ne répondrai à aucune question technique en privé

  3. #3
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Si je veux pouvoir calculer la profondeur je suis obligé de construire l'arbre avant par contre ?
    Vive les roues en pierre

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ça ne peut pas se traiter par une procédure récursive ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Il ne faut ajouter un niveau que si le parent du nouveau noeud est le noeud précédent. Si ce n'est pas le cas, il faut enlever des niveaux... quelque chose du genre

    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
      if(!cat->estRacine())	{
    		// Si on a changé de parent
    		if(pred->getIdParent == cat->getIdParent())	{
                       // rien
                    } else if (cat->getIdParent() == pred) {
    			decalage .= "-";
    			idParent = cat->getIdParent();
    		} else {
                       do {
                          decalage.pop_back(); // ou ce qu'il faut pour supprimer
                          pred = pred->getIdParen();
                       } while(pred->getIdParent != cat->getIdParent());
                    }
                    pred = cat;
    	}
    	// Si la catégorie est une racine
    	else	{
    		decalage = ""; // Je remet le décalage à 0
    		idParent = 0; // Ici je remets l'idParent à 0 car une catégorie racine a 0 en idParent
    	}
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Points : 231
    Points
    231
    Par défaut
    Je sais que ma proposition n'est pas très recherchée et que çe n'est pas vraiment propre (optimisé), mais je la trouve tellement simple...
    Est-ce qu'il ne suffirait pas de recompter à chaque fois le nombre de points de l'id du parent (il est bien représenté par une chaîne de caractères) ?
    Ca se fait en O(taille_idParent), ce qui est pareil au pire cas que la proposition de Jean-Marc Bourguet. Certes au total on fait plus de trucs inutiles, mais pas un si grand nombre que ça s'il n'y a pas 2000 sous-catégories...

  7. #7
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut et merci pour vos réponses ^^
    Je me suis inspiré de la méthode de Jean-Marc.Bourguet et ca fonctionne nickel

    borisd> Pour ta technique je crois que de toute façon t'es obligé de stocker quand même l'id du parent.

    Pour la récursivité quand je peux m'en passer j'hésite pas

    Bye
    Vive les roues en pierre

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

Discussions similaires

  1. [Smarty] affichage catégories et sous catégories
    Par tabbabi dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 06/11/2012, 14h19
  2. Réponses: 2
    Dernier message: 05/02/2010, 13h07
  3. [UML][UC] Comment représenter catégories et sous catégories
    Par Kakashi_sensei dans le forum Cas d'utilisation
    Réponses: 15
    Dernier message: 31/01/2008, 17h56
  4. [MySQL] Affichage des catégories et sous catégories
    Par onirisme dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/10/2007, 10h24
  5. Réponses: 17
    Dernier message: 07/09/2007, 08h06

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