2011-11-10 24 views
1

我有這個表的SQL表建立一個HTML列表樹:使用PHP

+-------------------------------+ 
| NodeID | Parent | HasChildren | 
+-------------------------------+ 
|1000000 |-1  |-1   | 
+--------+--------+-------------+ 
|2409999 |1000000 |-1   | 
+-------------------------------+ 
|2510921 |1000000 |-1   | 
+-------------------------------+ 
|2596822 |2510921 |0   | 
+-------------------------------+ 
|3000143 |2409999 |0   | 
+-------------------------------+ 
|3125674 |2409999 |0   | 
................................ 
     the list goes on 

...從我需要建立使用<ul><li>一個HTML樹列表。此表中的每個節點都是ID爲1000000的頂級節點的子節點(父節點爲「-1」)。此外,HasChildren「-1」告訴該節點有孩子,0 - 它沒有。是的,這有點古怪,但事實如此。所以,輸出應該是這樣的:

<ul> 
    <li>2409999</li> 
    <ul> 
    <li>3000143</li> 
    <li>3125674</li> 
    </ul> 
    <li>2510921</li> 
    <ul> 
    <li>2596822</li> 
    </ul> 
.... 
</ul> 

也許有人解決了同樣的問題?任何幫助,將不勝感激。謝謝!

+1

您示例中的數字與表中的數字不匹配。你可以用表格給出一個例子嗎? – Bazzz

+0

這個例子僅用於說明。我真的不能在桌子上做一個例子,因爲它有超過20K的條目。 – Ghinzu

+0

@Ghinzu,Bazzz表示您在問題頂部包含的示例數據與您問題末尾示例輸出中的數據不匹配。請你可以編輯它們,以便它們匹配? –

回答

3

正如上面提到的,它將使意義在表中使用嵌套組表示。如果您決定保留現有的表結構,然後做的一般方式,是讓沿線的遞歸函數:

function printBranch($parentID) { 
    foreach ($children as $child) { 
     if ($child is a Leaf) echo '<li>child</li>'; 
     elseif ($child is a Branch) printBranch($child); 
    } 
} 

不用說上面的代碼是僞代碼,但它應該表現總體思路。該功能在單個節點上執行,如果該節點有子節點,則它會在每個子節點上調用本身。這被稱爲遞歸。作爲一種常見的編程約定:有孩子的節點稱爲分支,而不稱爲樹葉的節點。