2009-10-29 54 views
0

我一直在使用二进制mlm系统的网站上工作。递归排列数组到水平

Illustration here

所以我必须在数据库中的两个表,用户ANAD关系。用户中有ID和个人数据列。关系有4列:ID,parentID,childID,pos。哪里pos是左或右。

我已经成功地编写了递归列出给定pid(parentID)的所有子项的函数。不过,我需要对它进行分级(用于显示和计算)。

我有用户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 
     ) 

) 

现在我有函数命名get_levels返回一个多维数组应该是这样的:

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. 

) 

这里的功能:

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; 
} 

function chi ldren_array($ pid,$ depth)返回子...对于$ depth = 1,它返回直接子元素(0或1或2),对于$ depth = 0它返回所有子元素

任何人都可以帮助我功能?我认为该功能的作品,但我不知道如何递归使用和添加到数组。

回答

0

看起来像在错误的上下文中使用数据结构。这是一棵二叉树,但它被表示成一个多层次的数组,它简而言之并没有定义它的边界和使用规则。

当使用树时,我会使用类似于具有两个子项左右的Node类的东西。迭代遍历树将是小菜一碟,插入/删除/编辑它很容易完成取决于你想遵循的规则集。在存储树时,我会使用某种Ahnentafel list,这可以很容易地在关系数据库中完成。

我不会混合迭代和存储过程,因为如果我改变存储规则,我可能也必须改变迭代的规则,反之亦然。

+1

我发现这个二叉树类:http://www.phpclasses.org/browse/file/11713.html 什么应该是在数据库中存储数据的最佳方式? ID | parentID | leftChildID | rightChildID? – Smaug 2009-10-29 16:51:43

+0

对于数据,我只会提及父母,如果没有其他方法可以找出它的位置可能会出现。没有父节点的节点是根节点。 – 2009-10-29 22:10:04