crazygogo
Messages postés135Date d'inscriptionsamedi 18 janvier 2003StatutMembreDernière intervention17 avril 2009
-
2 avril 2008 à 18:00
crazygogo
Messages postés135Date d'inscriptionsamedi 18 janvier 2003StatutMembreDernière intervention17 avril 2009
-
4 avril 2008 à 12:06
Bonjour à tous,
j'ai cherché pas mal sur ce site et sur le web mais pas moyen de trouver la solution à mon problème (pourtant ça me semble être un classique !) :
j'ai une table MySQL qui contient de quoi faire une arborescence:
CREATE TABLE `gestion_documentaire_dossiers` (
`dossier_id` int(10) unsigned NOT NULL auto_increment,
`dossier_parent_id` int(10) unsigned default NULL,
`dossier_nom` varchar(200) NOT NULL,
PRIMARY KEY (`dossier_id`)
);
INSERT INTO `gestion_documentaire_dossiers` (`dossier_id`,`dossier_parent_id`,`dossier_nom`) VALUES
(1,NULL,'Contrats'),
(2,NULL,'Lettres'),
(3,NULL,'Autres'),
(4,1,'Simon'),
(5,1,'Marcel'),
(6,1,'Maria'),
(7,3,'Simon'),
(8,3,'Maria'),
(9,3,'Marcel'),
(10,4,'15 mars 2008'),
(11,4,'12 janvier 2008');
si le dossier est à la racine, dossier_parent_id est NULL sinon dossier_parent_id contient le dossier_id du dossier dans lequel il se trouve
et la c'est le drame !!! je n'arrive pas à récupérer tout cela de manière 'propre'...
par exemple dans un tableau php multidomensionnel représentant l'arborescence...
j'ai essayé la récursivité, les foreach etc... mais pas moyen !!! je suis limité à PHP 4.3.11 par mon hébergeur (donc je ne dispose pas de toutes les fonctionnalités de PHP5)
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 2 avril 2008 à 19:40
Salut,
Pour récupérer tout ça dans un tableau php propre, c'est pas spécialement difficile. Le plus difficile, c'est d'exploiter ça ensuite lors de l'affichage (et ça reste pas compliqué).
La solution que j'ai à te proposer n'est pas super optimisée, parce qu'elle parcours 2 fois l'arborescence. En même temps, j'y réfléchis et je ne vois pas vraiment comment faire pour ne la parcourir qu'une seule fois... (peut-être avec une sous-requête)
Au lieu de NULL comme valeur d'id parent pour les éléments à la racine, je préfère utiliser 0 : l'autoincrement commence de toute façon à 1, donc c'est une valeur qui n'existera pas pour id_parent dans la table. L'avantage est que la valeur est directement utilisable dans un tableau PHP, et le résultat concernant le traitement est strictement le même.
Essaie un truc comme ça :
$sql = 'SELECT dossier_id, dossier_parent_id, dossier_nom
FROM gestion_documentaire_dossiers
ORDER BY dossier_parent_id, dossier_id;';
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 2 avril 2008 à 19:46
salut
en fait, c'est pas que tu parcours deux fois l'arbo, le probleme, c'est que tu parcours recursivement l'arbo... ce qui veut dire que si tu as 100 champs sur 10 niveaux, tu vas parourrir 100 * 10 fois ton arbo.
crazygogo
Messages postés135Date d'inscriptionsamedi 18 janvier 2003StatutMembreDernière intervention17 avril 2009 3 avril 2008 à 17:50
neigedhiver merci pour ta réponse rapide et pour ton script. il me donne un tableau "à plat"...
j'ai besoin de récupérer un tableau php multidimensionnel représentant l'arborescence, je ne sais pas si c'est possible ?....
coucou747 la représentation intervallaire est intéressante mais ça m'a l'air un peu compliqué pour ce que je veux faire... néanmoins merci pour ta réponse et je garde ton lien sous la main car le concept de parcours d'arbre est très intéressant !
crazygogo
Messages postés135Date d'inscriptionsamedi 18 janvier 2003StatutMembreDernière intervention17 avril 2009 3 avril 2008 à 18:58
Bon je sais que c'est pas du bon code, optimisé, bien codé et tout et tout mais c'est un bricolage que j'essaie de faire pour créer mon tableau !!! alors pour vous montrer ou j'en suis, je met ci-dessous mon code, puis les informations de debugage qu'il affiche...
tout en bas de ces infos de debug : tree2 = le tableau que je parviens à générer : il est pas mal mais un seul niveau d'arbo seulement alors que le deuxieme niveau devrait être affecté d'après les infos de debug par la fonction rempliBranche (la même qui me rempli bien mon premier niveau !!)
la j'avoue que je suis un peu pommé !!!....
CODE :
// On récupère tous les dossier et sous-dossiers de l'utilisateur :
$tree1 = array();
$sql = 'SELECT *
FROM gestion_documentaire_dossiers
ORDER BY dossier_nom;';
$DB_CX->DbQuery($sql);
while ($enr = $DB_CX->DbNextRow()) {
$dossier_parent_id = $enr['dossier_parent_id'];
if(trim($dossier_parent_id=='')){
$dossier_parent_id = 0;
}
$tree1[] =
array(
'dossier_id' => $enr['dossier_id'],
'dossier_parent_id' => $dossier_parent_id,
'dossier_nom' => $enr['dossier_nom']
);
}
// Tant que le tree1 est pas vide (on efface ses entrées au fur et a mesure qu'on les insère dans tree2)
while(count($tree1)>0){
foreach ($tree1 as $id => $dossier) {
if(in_array($dossier['dossier_parent_id'],$dossiersDejaCrees)){
// Le dossier pere de ce dossier a déja été créé dans tree2, on peut donc lancer les recherches...
$dossier['dossier_fils'] = array();
chercheIdDansTree($dossier['dossier_parent_id'],$dossier,$tree2,$id);
}
}
}
function chercheIdDansTree($id_a_trouver,$valeur_a_donner,&$tableau_a_explorer,$id_a_effacer_dans_tree1){
global $tree1,$dossiersDejaCrees;
crazygogo
Messages postés135Date d'inscriptionsamedi 18 janvier 2003StatutMembreDernière intervention17 avril 2009 4 avril 2008 à 12:06
Bon alors mes infos de debug semblent faire bugger l'affichage du forum !!!..... Mais je n'ai pas trouvé comment modifier mon message....
Sinon après avoir trituré mon cerveau dans tous les sens et m'être arraché tous les cheveux, j'ai réussi à faire le bricolage que vous trouverez ci-dessous et qui a le mérite de fonctionner !!!
Si vous avez des suggestions pour améliorer tout ça n'hésitez pas !
Merci.
CODE :
// On récupère tous les dossier et sous-dossiers de l'utilisateur dans le tableau $tree1 :
$tree1 = array();
$sql = 'SELECT *
FROM gestion_documentaire_dossiers
ORDER BY dossier_nom;';
$DB_CX->DbQuery($sql);
while ($enr = $DB_CX->DbNextRow()) {
$dossier_parent_id = $enr['dossier_parent_id'];
if(trim($dossier_parent_id=='')){
$dossier_parent_id = 0;
}
$tree1[] =
array(
'dossier_id' => $enr['dossier_id'],
'dossier_parent_id' => $dossier_parent_id,
'dossier_nom' => $enr['dossier_nom']
);
}
/*
On a maintenant tous les enregistrements dans tree1 sous la forme :
dossiersDejaCrees contient la liste des id de tous les dossiers déja créés sous la forme :
dossiersDejaCrees
(
[0] => 3
[1] => 1
[2] => 2
)
*/
// Tant que le tree1 n'est pas vide (on efface ses entrées au fur et a mesure qu'on les insère dans tree2) :
while(count($tree1)>0){
foreach ($tree1 as $id => $dossier) {
if(in_array($dossier['dossier_parent_id'],$dossiersDejaCrees)){
// Le dossier pere de ce dossier a déja été créé dans tree2, on peut donc lancer les recherches...
chercheIdDansTree($dossier['dossier_parent_id'],$dossier,$tree2,$id);
}
}
}
function chercheIdDansTree($id_a_trouver,$valeur_a_donner,&$tableau_a_explorer,$id_a_effacer_dans_tree1){
global $tree1,$dossiersDejaCrees;
foreach ($tableau_a_explorer as $id => $dossier) {