2010-02-01 158 views
3

我有parentId的一個簡單的數據庫樹,我想讀數據庫,並得到像上述數據庫樹多維數組

Array 
(
Title: Category 1 
Children => Array 
      (
       => Title: Category 1.1 

       => Title: Category 1.2 
        Children => Array 
           (
           => Title: Category 1.2.1 

           ) 
      ) 

) 

我試着用上面的代碼來實現數組

function getTree($rootid) 
    { 
     $result = =mysql_query("select * from tree where parentid='$rootid'"); 
     while ($row = mysql_fetch_array($result)) { 

     $arr[]=$row["Title"]; 
     getChilds($row["id"]); 

     } 

    } 


    function getChilds($id) 
    { 
     $result = =mysql_query("select * from tree where parentid='$id'"); 
     while ($row = mysql_fetch_array($result)) { 

     //childers nodes here 
     $arr[]=$row["Title"]; 

     getChilds($row["id"]); 

     } 

    } 

} 

我在如何將數組傳遞給遞歸函數時遇到了問題,所以繼續從我寫的最後一個節點開始的子節點等等。

它是一個類的內部實現,我知道我必須通過爲& $改編,但我不知道如何

任何幫助表示讚賞

感謝

回答

4

嘗試是這樣的:

<?php 
function getTree($rootid) 
{ 
    $arr = array(); 

    $result = mysql_query("select * from tree where parentid='$rootid'"); 
    while ($row = mysql_fetch_array($result)) { 
    $arr[] = array(
     "Title" => $row["Title"], 
     "Children" => getTree($row["id"]) 
    ); 
    } 
    return $arr; 
} 
?> 
+0

如果我們有深度超過10 – Amee 2016-09-08 18:17:16

3

如指出over here,使用鄰接表模型不是一個好方法。你最好使用preorder tree traversal

爲什麼?看,大部分時間(閱讀:在99.99%的情況下),你的應用程序的瓶頸將是數據庫。預定義樹遍歷實際上看起來更加複雜(主要是因爲它沒有在你的數據處於「自然」狀態之後遞歸地建模),但是你只需要發送一次查詢並完成。除此之外,在99%的用例中,您的應用程序將只顯示樹,而不是修改/重新排序。

+0

我有實現樹的遍歷,但其上重新定位真的很痛苦和移動,所以我真的不知道,如果我婉使用it.Thanks – ntan 2010-02-01 17:53:23

+0

我必須對 – ntan 2010-02-01 18:02:15

+1

我同意該怎麼辦只能在這裏同意Flavius。自從我發現它以來,我一直使用MPTT。我只用它讀取雖然。爲了添加,移動或刪除樹中的節點,我使用正常的id,parentid遞歸方法重新生成節點。這樣我就可以用最少的努力獲得兩個世界的好處。 – 2010-02-01 19:39:56