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

PHP & Base de données Discussion :

Select recursif avec parent_id


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 135
    Par défaut Select recursif avec parent_id
    bonjour,

    voici la fonction que j'utilise :

    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
    function createSelectTree($data, $idParent, $indentSymbol, $level)
    {
    	$cat = array();
    	foreach($data as $row){
    		if($row->parent_id == $idParent){
    			if($indentSymbol AND $level > 0){
    				$symbols = array_fill(0, $level, $indentSymbol);
    				$cat[$row->id] = implode('', $symbols) . $row->valeur;
    			}else{
    				$cat[$row->id] = $row->valeur;
    			}
    			$cat = $cat + createSelectTree($data, $row->id, $indentSymbol, $level++);
    		}
    	}
    	return $cat;
    }
    Voici ma base de données Mysql :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    --
    -- Structure de la table `articles_familles`
    --
     
    CREATE TABLE IF NOT EXISTS `articles_familles` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `valeur` varchar(150) NOT NULL,
      `parent_id` bigint(20) NOT NULL,
      `id_structure_associe` int(11) NOT NULL DEFAULT '0',
      `date_ajout` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      `ajoute_par` int(11) NOT NULL DEFAULT '0',
      `date_modif` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      `modifie_par` int(11) NOT NULL DEFAULT '0',
      `date_archivage` date NOT NULL DEFAULT '0000-00-00',
      `motif_archivage` mediumint(9) NOT NULL DEFAULT '0',
      `archive_par` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`),
      KEY `parent_id` (`parent_id`),
      KEY `id_structure_associe` (`id_structure_associe`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
     
    --
    -- Contenu de la table `articles_familles`
    --
     
    INSERT INTO `articles_familles` (`id`, `valeur`, `parent_id`, `id_structure_associe`, `date_ajout`, `ajoute_par`, `date_modif`, `modifie_par`, `date_archivage`, `motif_archivage`, `archive_par`) VALUES
    (1, 'Groupe 1', 0, 2, '2013-11-14 16:49:26', 1, '2013-11-14 16:50:41', 1, '0000-00-00', 0, 0),
    (2, 'Groupe 2', 0, 2, '2013-11-14 16:50:46', 1, '0000-00-00 00:00:00', 0, '0000-00-00', 0, 0),
    (3, 'Famille 1', 1, 2, '2013-11-14 16:53:30', 1, '2013-11-14 16:53:38', 1, '0000-00-00', 0, 0),
    (4, 'Famille 2', 1, 2, '2013-11-14 16:55:07', 1, '0000-00-00 00:00:00', 0, '0000-00-00', 0, 0),
    (5, 'Famille 3', 1, 2, '2013-11-14 16:55:17', 1, '0000-00-00 00:00:00', 0, '0000-00-00', 0, 0),
    (6, 'Xav', 1, 2, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00', 0, 0),
    (7, 'sssss', 2, 2, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00', 0, 0);

    cette fonction me sort la hiérarchie suivante :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <select id="parent_id" name="parent_id">
    <option value="0">Choisissez</option>
    <option value="1">Groupe 1</option>
    <option value="3">Famille 1</option>
    <option value="4">-Famille 2</option>
    <option value="5">--Famille 3</option>
    <option value="6">---Famille 4 de groupe 1</option>
    <option value="2">-Groupe 2</option>
    <option value="7">-Famille 1 de groupe 2</option>
    </select>

    Comme vous le voyez, il manque un tiret à la première Famille 1 de Groupe 1, ensuite il ajoute trop de tirets et enfin alors que groupe 2 à un parent_id à 0, il me rajoute le symbole.

    pouvez vous m'aider.

    Merci.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut Proposition d'algorithme en pseudo code
    Je pense que ton algorithme a plusieurs soucis !
    Je te propose celui-ci, en pseudo language, qui découpe en fait ton travail en deux : 1.création d'un arbre puis 2. création : linéarisation de l'arbre.

    Pour cela je te conseille d'utiliser une classe "Noeud" toute simple, ce sera plus clair.

    Voilà mon algo (que j'espère pas trop loin de la vérité):

    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
     
    classe Noeud {
               - Int id;
    	- String valeur;
    	- Tableau enfants;
    }
     
    Fonction arbo (liste, id_parent) {
    	Trouver les éléments de la liste ayant un parent égal à parent_id
    	Tous les mettre dans un tableau de Noeud, appelé résultat
    	Pour chaque noeud de résultat
    		noeud->enfants = arbo(liste, noeud->id);
    	Fpour
    	Retourner résultat
    }
     
     
    Fonction linéariser(arborescence)  {
    	Parcours d'arbre en profondeur d'abord (du grand classique, je pense tu as du voir ça à l'école)
    }
     
    arboresence = arbo(taListeDeDépart, NULL);
    listeFinale = linéariser(arboresence);
    Hésite pas à poster ton code PHP ensuite

    J'espère t'avoir apporté un peu d'aide !

Discussions similaires

  1. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 03h04
  2. [Excel] Selection multiple avec critères
    Par tibotibotibo dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/04/2005, 10h48
  3. Requete select imbriqués avec plusieurs références
    Par GAlion dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/08/2004, 14h06
  4. [LG]tri selection récursif
    Par max_lupin dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2004, 22h23
  5. [struts][JSP][select] problème avec le select
    Par redge_touch dans le forum Struts 1
    Réponses: 4
    Dernier message: 14/01/2004, 10h05

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