recursivité et menu multiniveaux

recursivité et menu multiniveaux - PHP - Programmation

Marsh Posté le 03-08-2004 à 10:45:21    

Bonjour,
 
Soit un un arbre :
 
node_id node_name node_parent
0 Root -1
2 2_2 0
3 3_3 2
4 4_4 0
5 5_5 4
6 6_6 0
7 7_7 6
8 8_8 0
9 9_9 8
10 10_10 0
11 11_11 10
12 12_12 0
13 13_13 12
 
Je voudrais parcourir cet arbre pour afficher des lignes javascripts et
ainsi contruire un menu multiniveaux.
 
Il faudrait sortir des lignes du genre :
 
Menu1_1 = new Array(''..'''.......) (1er element du 1er niveau)
Menu1_2 = new Array(''..'''.......)
Menu1_3 = new Array(''..'''.......)
Menu2_1 = new Array(''..'''.......)
Menu2_1_1 = new Array(''..'''.......)
Menu2_1_2 = new Array(''..'''.......)  (2eme element du 1er element du 2eme
niveau)
Menu2_2_1 = new Array(''..'''.......)
Menu2_2_2 = new Array(''..'''.......)  (2eme element du 2eme element du 2eme
niveau)
....
 
Et la je coince je ne sais pas rédiger de fonction récursive et je vois pas
comment faire pour écrire une sortie comme celle ci.
 
Vous avez surement deja fait ca et ca serait sympa de m'aiguiller voire de
me donner un petit bout de code.
 
Merci de m'éclairer.
 
Cordialement.
 
Jérôme Rautureau
Webmaster - Développeur
La Rochelle-Rochefort : territoire interactif
contact@larochellerochefort.com
Qui fait quoi sur La Rochelle - Rochefort : www.larochellerochefort.com

Reply

Marsh Posté le 03-08-2004 à 10:45:21   

Reply

Marsh Posté le 03-08-2004 à 12:41:51    

tu as plusieurs solution :  

  • la plus propre ( mais la plus complexe )  est de faire de la programmation objet en php  
  • la plus rapide a develloper  

tu utilise un tableau dont chaque element est un tableau : array(node_name,node_parent)
ainsi , tu accede a un tableau de tableau
dans ce cas il te faudra faire une fonction du genre :  

Code :
  1. function getDepthById($tree,$idNode){
  2.     if($idParent = getIdParent($tree,$idNode) != -1 )
  3.          return getDepthById($tree,$idParent) +1;
  4.     else
  5.           return 0;
  6. }
  7. function getNodeByLevel($tree,$level){
  8. $resultat = array();
  9. foreach($tree as $idNode => $node)
  10.     if(getDepthById($tree,$idNode) == $level)
  11.        array_push($resultat,$idNode);
  12. return $resultat;
  13. }

Reply

Marsh Posté le 03-08-2004 à 17:27:13    

Si tu ne veux pas t'embéter avec de la récursivité : http://sql.developpez.com/arborescence/ . Assez complexe quand même.
 
Sinon en récursif (mais peu performant => à mettre en cache à la limite)

Code :
  1. function menu( $idPere=null, $arbo='1' ){
  2.   $req = ' SELECT * FROM menu WHERE node_parent';
  3.    if( $idPere==null )
  4.      $req .= 'IS NULL';
  5.    else
  6.      $req .= '=$idPere';
  7.   $res = mysql_query( $req );
  8.   $i=0;
  9.   while( $ligne_menu=mysql_fetch_object($res) ){
  10.     $i++;
  11.     $nArbo = $arbo.'_'.$i;
  12.     echo "Menu$arbo =  new Array( '$ligne_menu->node_name' )";
  13.     menu( $ligne_menu->node_id, $nArbo );
  14.   }
  15. }


 
C'est pas testé hein :o  
 
 [:figti] je m'aperçois que je ne comprens pas le champ node_name dans ta table ? C'est quoi, le nom du menu ?
 

Reply

Marsh Posté le 03-08-2004 à 17:48:03    

Merci pascal_ pour ce lien, je connaissais pas cette methode et c'est sacrément efficace et ingénieux :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed