2009-10-29 4 views
0

J'ai travaillé sur un site qui utilise le système binaire mlm.Triez récursivement le tableau aux niveaux

Illustration here

J'ai donc deux tables dans la base de données, les utilisateurs ANAD relations. Il y a des colonnes ID et données personnelles dans les utilisateurs. Les relations ont 4 colonnes: ID, parentID, childID, pos. Où pos est soit à gauche ou à droite.

J'ai écrit avec succès une fonction qui répertorie récursivement tous les enfants de pid donné (parentID). Cependant j'ai besoin de le trier en niveaux (à des fins d'affichage et de calcul).

J'ai un tableau d'enfants de l'utilisateur ID = 1:

Array 
(
    [0] => Array 
     (
      [id] => 2 
      [parentID] => 1 
      [pos] => l 
     ) 

    [1] => Array 
     (
      [id] => 4 
      [parentID] => 2 
      [pos] => l 
     ) 

    [2] => Array 
     (
      [id] => 8 
      [parentID] => 4 
      [pos] => l 
     ) 

    [3] => Array 
     (
      [id] => 5 
      [parentID] => 2 
      [pos] => p 
     ) 

    [4] => Array 
     (
      [id] => 3 
      [parentID] => 1 
      [pos] => p 
     ) 

    [5] => Array 
     (
      [id] => 6 
      [parentID] => 3 
      [pos] => l 
     ) 

    [6] => Array 
     (
      [id] => 7 
      [parentID] => 3 
      [pos] => p 
     ) 

) 

Maintenant, j'ai fonction nommée get_levels qui retourne un tableau multidimensionnel qui devrait ressembler à ceci:

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [id] => 2 
        [parentID] => 1 
        [pos] => l 
       ) 

      [1] => Array 
       (
        [id] => 3 
        [parentID] => 1 
        [pos] => p 
       ) 

     ) 
    [1] => Array 
     (
      [0] => Array 
       (
        [id] => 4 
        [parentID] => 2 
        [pos] => l 
       ) 

      [1] => Array 
       (
        [id] => 5 
        [parentID] => 2 
        [pos] => p 
       ) 
      [2] => Array 
       (
        [id] => 6 
        [parentID] => 3 
        [pos] => l 
       ) 

      [3] => Array 
       (
        [id] => 7 
        [parentID] => 3 
        [pos] => p 
       ) 

     ) 
    ETC. 

) 

Voici la fonction:

function get_levels($pid,$level, $level_id){ 
     $children = children_array($pid,1); 
     if (sizeof($children) > 0): 
      foreach ($children as $child): 
      if ($child["parentID"] == $pid): 


       get_levels($child["id"], $level, $level_id+1); 
       $level[$level_id][] = $child;   


     endif; 


     endforeach; 
     endif; 
     return $level; 
} 

fonction chi ldren_array ($ pid, $ depth) retourne les enfants ... pour $ depth = 1 il renvoie les enfants immédiats (0 ou 1 ou 2), pour $ depth = 0 il retourne tous les enfants

Quelqu'un peut-il m'aider avec ça? fonction? Je pense que la fonction fonctionne, cependant Je ne sais pas comment utiliser récursivement et ajouter au tableau.

Répondre

0

On dirait que vous utilisez une structure de données dans le mauvais contexte. C'est un arbre binaire, mais il est représenté dans un tableau à plusieurs niveaux qui, en définitive, ne définit pas ses limites et ses règles d'utilisation. Lorsque j'utilise l'arbre, j'utiliserais quelque chose comme une classe Node qui a deux enfants, à gauche et à droite. Itérer à travers l'arbre serait un jeu d'enfant, l'insertion/la suppression/l'édition est facile en fonction de l'ensemble de règles que vous voulez suivre. Lorsque je stocke l'arbre, j'utilise une sorte de Ahnentafel list qui peut facilement être fait dans une base de données relationnelle.

Je ne voudrais en aucun cas mélanger les processus d'itération et de stockage car si je change les règles de stockage, il se peut que je doive aussi changer les règles d'itération et vice versa.

+1

J'ai trouvé cette classe d'arbre binaire: http://www.phpclasses.org/browse/file/11713.html Quelle devrait être la meilleure façon de stocker des données dans la base de données? ID | parentID | leftChildID | rightChildID? – Smaug

+0

Pour les données, je ne ferais référence qu'au parent et à la position s'il n'y a pas d'autre moyen de le comprendre. Le noeud qui n'a pas de parent est la racine. –

Questions connexes