Salut,
Je possède une table comportant une association réflexive ( l'un des champs possède une contrainte avec un autre champ de la même table)
voici le format de ma table :
id(PK) description parent_id(FK reference self(ID))
1 je suis la racine 1 (appartient à lui même...)
2 je suis 2ème ! 1 (appartient à 1, c'est à dire racine)
3 je suis 2ème aussi ! 1 (appartient aussi à 1)
4 fils de 2 ! 2 (appartient à 2)
5 2ème fils de 2 ! 2 (idem.....)
6 fils de fils de 2 4 (id=4 est mon père ! et id=1 est mon grand père...)
Voilà en gros, vous l'aurez compris, c'est un système d'arborescence, de diagramme, d'organigramme, comme en entreprise avec le patron, les cadres, les employés, les délégués......ou dans un site : des menus, sous menus etc...
Ce que je souhaiterais faire c'est transformer ces données en un tableau multidimensionnel associatif :
$tab = array( 'Je suis la racine' => array( 'Je suis 2ème' => array( 'fils de 2' => array( 'fils de fils de 2' ) , '2ème fils de 2 !') , 'Je suis 2eme aussi !') );
Autrement dit, la clé serait l'intitulé de la description et la donnée (si il existe des enfants) est un tableau qui contiendra un/des clé(s) et une/des donnée(s) qui........(récursivité infinie)
Je n'arrive pas à concevoir un algo qui tienne la route et qui puisse générer un tel tableau à partir d'un feed comme présenté si dessus et ce, avec un niveau de récursivité infini.
Il est clair qu'il faut donc une fonction récursive, dont l'un des paramètres sera un tableau passé par référence et étant réécrit à chaque execution.
[j'ai modifié la structure de la db dans ce code, afin de simplifier les choses, l'id n'est plus un INT et parent_id n'est plus un INT non plus, maintenant, la clé primaire c'est LIB (varchar) et PARENT_LIB (varchar aussi) qui fonctionnent de la même façon que l'exemple.]
Cette fonction est fausse, certaines variables pointent vers rien du tout, j'ai posté la mauvaise version ^^
$this->_SQL est une requête SQL passée au constructeur. Requête standart pour le moment : SELECT * FROM test
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 protected function Parse( &$temp =array() , $parent = 0 ) { $mem = array(); $root = MySQL::Values_Array( $this->_SQL.' WHERE parent_lib =\''.$parent.'\'' ); $req = MySQL::Execute( $this->_SQL.' WHERE parent_lib =\''.$root[ 'lib' ].'\'' ); while( $res = mysql_fetch_array( $req ) ) { if( MySQL::Num_Rows( $this->_SQL.' WHERE parent_lib =\''.$root[ 'lib' ].'\'' ) > 1 ) self::Parse( $temp , $root[ 'lib' ] ); $mem[] = $res[ 'lib' ]; } $this->_ARRAY[ $root[ 'lib' ] ] = $mem; }
$this->_ARRAY est le tableau qui sera retourné par un accesseur plus tard et qui donnera le tableau tant désiré.
MySQL::Values_Array() fait partie de ma classe perso qui renvoit une ligne de résultat mysql de la requête passée en paramètre.
La fonction que j'ai fait actuellement écrase apparement les données au fur et à mesure
Si quelqu'un pouvait me sauver la vie, ça me ferait bien plaisir !
Partager