2015-04-01 272 views
4

所以,我的問題是,我想建立這兩個表的樹:PHP - 如何構建樹結構列表?

Parent table: 
+-------+---------------+ 
| pr_id | parent_name | 
+-------+---------------+ 
| 1 |  p  | 
| 2 |  p_0  | 
| 3 |  p_0_1  | 
| 4 |  q  | 
+-------+---------------+ 

Child table: 
+-------+---------------+---------------------------+ 
| ch_id |  pr_id  |  child_name   | 
+-------+---------------+---------------------------+ 
| 1 |  1  |   p_0   | 
| 2 |  1  |   p_1   | 
| 3 |  2  |   p_0_0   | 
| 4 |  2  |   p_0_1   | 
| 5 |  3  |   p_0_1_0   | 
| 6 |  3  |   p_0_1_1   | 
| 7 |  4  |   q_0   | 
| 8 |  4  |   q_1   | 
+-------+---------------+---------------------------+ 

而且樹應該是這樣的:

  • p
    • P_0
      • p_0_0
      • p_0_1
        • p_0_1_0
        • p_0_1_1
  • q

任何人可以幫我了一個遞歸解決方案?

+2

你試過了嗎??? – Anshul 2015-04-01 07:00:01

+0

我試圖在「_」字符處爆炸父類和子類名稱,然後檢查是否設置了爆炸數組的第2或第3元素。但它是一個大混亂。 – 2015-04-01 07:09:36

回答

18

你並不需要在數據庫中它來創建2個表,你可以從一個表保持它像下面只

+-------+---------------+---------------------------+ 
| id | parent_id |   title   | 
+-------+---------------+---------------------------+ 
| 1 |  0  | Parent Page    | 
| 2 |  1  | Sub Page    | 
| 3 |  2  | Sub Sub Page   | 
| 4 |  0  | Another Parent Page  | 
+-------+---------------+---------------------------+ 

產生的陣列會像

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [parent_id] => 0 
      [title] => Parent Page 
      [children] => Array 
         (
          [0] => Array 
           (
            [id] => 2 
            [parent_id] => 1 
            [title] => Sub Page 
            [children] => Array 
               (
                [0] => Array 
                 (
                  [id] => 3 
                  [parent_id] => 1 
                  [title] => Sub Sub Page 
                 ) 
               ) 
           ) 
         ) 
     ) 
    [1] => Array 
     (
      [id] => 4 
      [parent_id] => 0 
      [title] => Another Parent Page 
     ) 
) 

您需要使用下面的遞歸函數來實現它

function buildTree(array $elements, $parentId = 0) { 
    $branch = array(); 

    foreach ($elements as $element) { 
     if ($element['parent_id'] == $parentId) { 
      $children = buildTree($elements, $element['id']); 
      if ($children) { 
       $element['children'] = $children; 
      } 
      $branch[] = $element; 
     } 
    } 

    return $branch; 
} 

$tree = buildTree($rows); 

算法很簡單:

  1. 取所有元素的數組和當前父代的ID (最初爲0/nothing/null/whatever)。
  2. 循環遍歷所有元素。
  3. 如果元素的parent_id與您在1中獲得的當前父級id匹配,則該元素是父級的子級。把它放在當前孩子的名單 (這裏是$ branch)。
  4. 用3中剛剛標識的元素的id遞歸地調用函數,即找到該元素的所有子元素, 並將它們添加爲子元素。
  5. 返回找到的孩子的列表。
+0

我如何打印這個結構列表? – 2015-04-01 07:18:18

+0

@VaimanHunor您可以遍歷創建的數組,或者您可以使用該函數並寫入代碼以在函數內部進行打印。 – Veerendra 2015-04-01 07:19:28

+1

非常好,對我很有用.. – 2016-08-24 06:47:24