2015-04-01 187 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