2009-10-29 109 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