TreeView à partir d'une table MySQL

Signaler
Messages postés
135
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
17 avril 2009
-
Messages postés
135
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
17 avril 2009
-
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)

toute aide sera la bienvenue !!

Merci

Crazygogo

5 réponses

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
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;';

if ($resultat = mysql_query($sql)) {
if (mysql_num_rows($resultat) > 0) {
while($ligne = mysql_fetch_assoc($resultat)) {
$tree[$ligne['dossier_parent_id']][$ligne['dossier_id']] = $ligne['dossier_nom'];
}
}
else {
// Aucun résultat
}
}

function affiche_tree(array $tree, $id) {
static $niveau = -1;
$niveau++;
foreach ($tree[$id] as $id_enfant => $nom_enfant) {
echo str_repeat("\t", $niveau) . $id_enfant . ' - ' . $nom_enfant . "\n";
if (is_array($tree[$id_enfant])) {
affiche_tree($tree, $id_enfant);
}
}
$niveau--;
}

header('Content-type: text/plain');
affiche_tree($tree, 0);

Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
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.

t'as un autre format de tables pour faire des arborescences : http://www.phpcs.com/codes/ARBORESCENCE_45943.aspx

/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/
Messages postés
135
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
17 avril 2009

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és
135
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
17 avril 2009

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']
    );
}

$cpt = 0;
$tree2 = array();
$dossiersDejaCrees = array();
foreach ($tree1 as $id => $dossier) {
    if($dossier['dossier_parent_id']==0){
        $dossiersDejaCrees[] = $dossier['dossier_id'];
        $tree2[$cpt] = $dossier;
        unset($tree1[$id]);
        $tree2[$cpt]['dossier_fils'] = array();
        $cpt ++;
    }
}

echo('<hr><hr><hr>tree1 : ');
print_r($tree1);
echo('

');
echo('<hr><hr><hr>tree2 : ');
print_r($tree2);
echo('

<hr><hr><hr>');

// 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;
   
    echo("<hr> chercheIdDansTree(id_a_trouver=$id_a_trouver,valeur_a_donner=$valeur_a_donner,&tableau_a_explorer=$tableau_a_explorer,id_a_effacer_dans_tree1=$id_a_effacer_dans_tree1)
");
    echo("valeur_a_donner : ");
    print_r($valeur_a_donner);
    echo("

");
    echo("tableau_a_explorer : ");
    print_r($tableau_a_explorer);
    echo("

");
   
    foreach ($tableau_a_explorer as $id => $dossier) {
       
        echo('foreach ($tableau_a_explorer as $id = > $dossier)');
        echo('id : ');
        print_r($id);
        echo('

');
        echo('dossier : ');
        print_r($dossier);
        echo('

');
       
        if(isset($dossier['dossier_id'])){
       
            echo('$dossier[\'dossier_id\'] is set : '.$dossier['dossier_id'].'
');
       
            if($dossier['dossier_id']==$id_a_trouver){
           
                echo('$dossier[\'dossier_id\']==$id_a_trouver
');
           
                rempliBranche($tableau_a_explorer[$id],'dossier_fils',$valeur_a_donner);
                unset($tree1[$id_a_effacer_dans_tree1]);
                $dossiersDejaCrees[] = $id_a_effacer_dans_tree1;
               
                echo('unset($tree1[$id_a_effacer_dans_tree1='.$id_a_effacer_dans_tree1.']);
');
               
                break;
               
            }
            elseif(count($dossier['dossier_fils'])>0){
                chercheIdDansTree($id_a_trouver,$valeur_a_donner,$dossier['dossier_fils'],$id_a_effacer_dans_tree1);
            }
        }
        else{
            if(is_array($dossier)){
                chercheIdDansTree($id_a_trouver,$valeur_a_donner,$dossier,$id_a_effacer_dans_tree1);
            }
        }
       
        echo('');
       
    }
}

function rempliBranche(&$branche,$cle,$valeur){
    global $tree2;

    echo(" rempliBranche(&branche=$branche,cle=$cle,valeur=$valeur) ");
    echo('branche : ');
    print_r($branche);
    echo('

');
    echo('valeur : ');
    print_r($valeur);
    echo('

');

    $branche[$cle][] = $valeur;
   
    echo('**** APRES **** : branche : ');
    print_r($branche);
    echo('

');
    echo('**** APRES **** : tree2 : ');
    print_r($tree2);
    echo('

');
}

echo('<hr><hr><hr>tree2 : ');
print_r($tree2);
echo('

');
echo('<hr><hr><hr>tree1 : ');
print_r($tree1);
echo('

<hr><hr><hr>');

DEBUG :

tree1 : Array
(
[0] => Array
(
[dossier_id] = > 11
[dossier_parent_id] => 4
[dossier_nom] => 12 janvier 2008
)

[1] => Array
(
[dossier_id] => 10
[dossier_parent_id] => 4
[dossier_nom] => 15 mars 2008
)

[3] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
)

[4] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
)

[5] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
)

[6] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
)

[7] => Array
(
[dossier_id] => 8
[dossier_parent_id] => 3
[dossier_nom] => Maria
)

[8] => Array
(
[dossier_id] => 6
[dossier_parent_id] => 1
[dossier_nom] => Maria
)

)

<hr /><hr /><hr />tree2 : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

<hr /><hr /><hr /><hr /> chercheIdDansTree(id_a_trouver=1,valeur_a_donner=Array,&tableau_a_explorer=Array,id_a_effacer_dans_tree1=3)
valeur_a_donner : Array
(
[dossier_id] => 4
[dossier_parent_id] = > 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

tableau_a_explorer : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

foreach ($tableau_a_explorer as $id => $dossier) id : 0

dossier : Array
(
[dossier_id] => 3
[dossier_parent_id] = > 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
)

)

$dossier['dossier_id'] is set : 3
foreach ($tableau_a_explorer as $id => $dossier) id : 1

dossier : Array
(
[dossier_id] => 1
[dossier_parent_id] = > 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
)

)

$dossier['dossier_id'] is set :
1
$dossier['dossier_id']==$id_a_trouver
rempliBranche(&branche=Array,cle=dossier_fils,valeur=Array) branche : Array
(
[dossier_id] => 1
[dossier_parent_id] = > 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
)

)

valeur : Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

**** APRES **** : branche : Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => BERNARD Simon
[dossier_fils] => Array
(
)

)

)

)

**** APRES **** : tree2 : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

unset($tree1[$id_a_effacer_dans_tree1=3]);
<hr /> chercheIdDansTree(id_a_trouver=3,valeur_a_donner=Array,&tableau_a_explorer=Array,id_a_effacer_dans_tree1=4)
valeur_a_donner : Array
(
[dossier_id] => 7
[dossier_parent_id] = > 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

tableau_a_explorer : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

foreach ($tableau_a_explorer as $id => $dossier) id : 0

dossier : Array
(
[dossier_id] => 3
[dossier_parent_id] = > 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
)

)

$dossier['dossier_id'] is set :
3
$dossier['dossier_id']==$id_a_trouver
rempliBranche(&branche=Array,cle=dossier_fils,valeur=Array) branche : Array
(
[dossier_id] => 3
[dossier_parent_id] = > 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
)

)

valeur : Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

**** APRES **** : branche : Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

**** APRES **** : tree2 : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

unset($tree1[$id_a_effacer_dans_tree1=4]);
<hr /> chercheIdDansTree(id_a_trouver=1,valeur_a_donner=Array,&tableau_a_explorer=Array,id_a_effacer_dans_tree1=5)
valeur_a_donner : Array
(
[dossier_id] => 5
[dossier_parent_id] = > 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

tableau_a_explorer : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

foreach ($tableau_a_explorer as $id => $dossier) id : 0

dossier : Array
(
[dossier_id] => 3
[dossier_parent_id] = > 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

$dossier['dossier_id'] is set : 3
<hr /> chercheIdDansTree(id_a_trouver=1,valeur_a_donner=Array,&tableau_a_explorer=Array,id_a_effacer_dans_tree1=5)
valeur_a_donner : Array
(
[dossier_id] => 5
[dossier_parent_id] = > 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

tableau_a_explorer : Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

foreach ($tableau_a_explorer as $id => $dossier) id : 0

dossier : Array
(
[dossier_id] => 7
[dossier_parent_id] = > 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

$dossier['dossier_id'] is set : 7
foreach ($tableau_a_explorer as $id => $dossier) id : 1

dossier : Array
(
[dossier_id] => 1
[dossier_parent_id] = > 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

$dossier['dossier_id'] is set :
1
$dossier['dossier_id']==$id_a_trouver
rempliBranche(&branche=Array,cle=dossier_fils,valeur=Array) branche : Array
(
[dossier_id] => 1
[dossier_parent_id] = > 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

valeur : Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

**** APRES **** : branche : Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

**** APRES **** : tree2 : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

unset($tree1[$id_a_effacer_dans_tree1=5]);
<hr /> chercheIdDansTree(id_a_trouver=3,valeur_a_donner=Array,&tableau_a_explorer=Array,id_a_effacer_dans_tree1=6)
valeur_a_donner : Array
(
[dossier_id] => 9
[dossier_parent_id] = > 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

tableau_a_explorer : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

foreach ($tableau_a_explorer as $id => $dossier) id : 0

dossier : Array
(
[dossier_id] => 3
[dossier_parent_id] = > 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

$dossier['dossier_id'] is set :
3
$dossier['dossier_id']==$id_a_trouver
rempliBranche(&branche=Array,cle=dossier_fils,valeur=Array) branche : Array
(
[dossier_id] => 3
[dossier_parent_id] = > 0
[dossier_nom] => Autre
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

)

)

valeur : Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

**** APRES **** : branche : Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

**** APRES **** : tree2 : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

unset($tree1[$id_a_effacer_dans_tree1=6]);
<hr /> chercheIdDansTree(id_a_trouver=3,valeur_a_donner=Array,&tableau_a_explorer=Array,id_a_effacer_dans_tree1=7)
valeur_a_donner : Array
(
[dossier_id] => 8
[dossier_parent_id] = > 3
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

tableau_a_explorer : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

foreach ($tableau_a_explorer as $id => $dossier) id : 0

dossier : Array
(
[dossier_id] => 3
[dossier_parent_id] = > 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

$dossier['dossier_id'] is set :
3
$dossier['dossier_id']==$id_a_trouver
rempliBranche(&branche=Array,cle=dossier_fils,valeur=Array) branche : Array
(
[dossier_id] => 3
[dossier_parent_id] = > 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

valeur : Array
(
[dossier_id] => 8
[dossier_parent_id] => 3
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

**** APRES **** : branche : Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

[2] => Array
(
[dossier_id] => 8
[dossier_parent_id] => 3
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

)

)

**** APRES **** : tree2 : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

[2] => Array
(
[dossier_id] => 8
[dossier_parent_id] => 3
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

unset($tree1[$id_a_effacer_dans_tree1=7]);
<hr /> chercheIdDansTree(id_a_trouver=1,valeur_a_donner=Array,&tableau_a_explorer=Array,id_a_effacer_dans_tree1=8)
valeur_a_donner : Array
(
[dossier_id] => 6
[dossier_parent_id] = > 1
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

tableau_a_explorer : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => utres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

[2] => Array
(
[dossier_id] => 8
[dossier_parent_id] => 3
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

foreach ($tableau_a_explorer as $id => $dossier) id : 0

dossier : Array
(
[dossier_id] => 3
[dossier_parent_id] = > 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

[2] => Array
(
[dossier_id] => 8
[dossier_parent_id] => 3
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

)

)

$dossier['dossier_id'] is set : 3
<hr /> chercheIdDansTree(id_a_trouver=1,valeur_a_donner=Array,&tableau_a_explorer=Array,id_a_effacer_dans_tree1=8)
valeur_a_donner : Array
(
[dossier_id] => 6
[dossier_parent_id] = > 1
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

tableau_a_explorer : Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

[2] => Array
(
[dossier_id] => 8
[dossier_parent_id] => 3
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

)

foreach ($tableau_a_explorer as $id => $dossier) id : 0

dossier : Array
(
[dossier_id] => 7
[dossier_parent_id] = > 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

$dossier['dossier_id'] is set : 7
foreach ($tableau_a_explorer as $id => $dossier) id : 1

dossier : Array
(
[dossier_id] => 9
[dossier_parent_id] = > 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

$dossier['dossier_id'] is set : 9
foreach ($tableau_a_explorer as $id => $dossier) id : 2

dossier : Array
(
[dossier_id] => 8
[dossier_parent_id] = > 3
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

$dossier['dossier_id'] is set : 8
foreach ($tableau_a_explorer as $id => $dossier) id : 1

dossier : Array
(
[dossier_id] => 1
[dossier_parent_id] = > 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

$dossier['dossier_id'] is set :
1
$dossier['dossier_id']==$id_a_trouver
rempliBranche(&branche=Array,cle=dossier_fils,valeur=Array) branche : Array
(
[dossier_id] => 1
[dossier_parent_id] = > 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

)

)

valeur : Array
(
[dossier_id] => 6
[dossier_parent_id] => 1
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

**** APRES **** : branche : Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

[2] => Array
(
[dossier_id] => 6
[dossier_parent_id] => 1
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

)

)

**** APRES **** : tree2 : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

[2] => Array
(
[dossier_id] => 8
[dossier_parent_id] => 3
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

[2] => Array
(
[dossier_id] => 6
[dossier_parent_id] => 1
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

)

)

[2] => Array
(
[dossier_id] => 2
[dossier_parent_id] => 0
[dossier_nom] => Lettres
[dossier_fils] => Array
(
)

)

)

unset($tree1[$id_a_effacer_dans_tree1=8]);
<hr /> chercheIdDansTree(id_a_trouver=4,valeur_a_donner=Array,&tableau_a_explorer=Array,id_a_effacer_dans_tree1=0)
valeur_a_donner : Array
(
[dossier_id] => 11
[dossier_parent_id] = > 4
[dossier_nom] => 12/01/2008
[dossier_fils] => Array
(
)

)

tableau_a_explorer : Array
(
[0] => Array
(
[dossier_id] => 3
[dossier_parent_id] => 0
[dossier_nom] => Autres
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 7
[dossier_parent_id] => 3
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 9
[dossier_parent_id] => 3
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

[2] => Array
(
[dossier_id] => 8
[dossier_parent_id] => 3
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

)

)

[1] => Array
(
[dossier_id] => 1
[dossier_parent_id] => 0
[dossier_nom] => Contrats
[dossier_fils] => Array
(
[0] => Array
(
[dossier_id] => 4
[dossier_parent_id] => 1
[dossier_nom] => Simon
[dossier_fils] => Array
(
)

)

[1] => Array
(
[dossier_id] => 5
[dossier_parent_id] => 1
[dossier_nom] => Marcel
[dossier_fils] => Array
(
)

)

[2] => Array
(
[dossier_id] => 6
[dossier_parent_id] => 1
[dossier_nom] => Maria
[dossier_fils] => Array
(
)

)

)
Messages postés
135
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
17 avril 2009

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 :

tree1
(
    [0] => Array
        (
            [dossier_id] => 11
            [dossier_parent_id] => 4
            [dossier_nom] => 12/01/2008
        )

    [1] => Array
        (
            [dossier_id] => 10
            [dossier_parent_id] => 4
            [dossier_nom] => 15/03/2008
        )
    [2] => Array
        (
            [dossier_id] => 3
            [dossier_parent_id] => 0
            [dossier_nom] => Autres
        )
)
*/
$cpt = 0;
$tree2 = array();
$dossiersDejaCrees = array();
foreach ($tree1 as $id => $dossier) {
    if($dossier['dossier_parent_id']==0){
        $dossiersDejaCrees[] = $dossier['dossier_id'];
        $tree2[$cpt] = $dossier;
        unset($tree1[$id]);
        $cpt ++;
    }
}
/*
tree2 ne contient que les dossiers racine sous la forme :

tree2
(
    [0] => Array
        (
            [dossier_id] => 3
            [dossier_parent_id] => 0
            [dossier_nom] => Autres
        )

    [1] => Array
        (
            [dossier_id] => 1
            [dossier_parent_id] => 0
            [dossier_nom] => Contrats
        )

    [2] => Array
        (
            [dossier_id] => 2
            [dossier_parent_id] => 0
            [dossier_nom] => Lettres
        )
)

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) {
       
        if(isset($dossier['dossier_id'])){
            if($dossier['dossier_id']==$id_a_trouver){
                rempliBranche($tableau_a_explorer[$id],'dossier_fils',$valeur_a_donner);
                unset($tree1[$id_a_effacer_dans_tree1]);
                $dossiersDejaCrees[] = $id_a_effacer_dans_tree1;
                break;
            }
            elseif(count($dossier['dossier_fils'])>0){
                chercheIdDansTree($id_a_trouver,$valeur_a_donner,$tableau_a_explorer[$id]['dossier_fils'],$id_a_effacer_dans_tree1);
            }
        }
        else{
            if(is_array($dossier)){
                chercheIdDansTree($id_a_trouver,$valeur_a_donner,$tableau_a_explorer[$id],$id_a_effacer_dans_tree1);
            }
        }
       
    }
}

function rempliBranche(&$branche,$cle,$valeur){
    $branche[$cle][] = $valeur;
}

RESULTAT:

$tree2 = Array
(
    [0] => Array
        (
            [dossier_id] => 3
            [dossier_parent_id] => 0
            [dossier_nom] => Autres
            [dossier_fils] => Array
                (
                    [0] => Array
                        (
                            [dossier_id] => 7
                            [dossier_parent_id] => 3
                            [dossier_nom] => Simon
                        )

                    [1] => Array
                        (
                            [dossier_id] => 9
                            [dossier_parent_id] => 3
                            [dossier_nom] => Marcel
                        )

                    [2] => Array
                        (
                            [dossier_id] => 8
                            [dossier_parent_id] => 3
                            [dossier_nom] => Maria
                        )

                )

        )

    [1] => Array
        (
            [dossier_id] => 1
            [dossier_parent_id] => 0
            [dossier_nom] => Contrats
            [dossier_fils] => Array
                (
                    [0] => Array
                        (
                            [dossier_id] => 4
                            [dossier_parent_id] => 1
                            [dossier_nom] => Simon
                            [dossier_fils] => Array
                                (
                                    [0] => Array
                                        (
                                            [dossier_id] => 11
                                            [dossier_parent_id] => 4
                                            [dossier_nom] => 12/01/2008
                                        )

                                    [1] => Array
                                        (
                                            [dossier_id] => 10
                                            [dossier_parent_id] => 4
                                            [dossier_nom] => 15/03/2008
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [dossier_id] => 5
                            [dossier_parent_id] => 1
                            [dossier_nom] => Marcel
                        )

                    [2] => Array
                        (
                            [dossier_id] => 6
                            [dossier_parent_id] => 1
                            [dossier_nom] => Maria
                        )

                )

        )

    [2] => Array
        (
            [dossier_id] => 2
            [dossier_parent_id] => 0
            [dossier_nom] => Lettres
        )

)


YES !

Crazygogo