【问题标题】:PHP - How to build tree structure list?PHP - 如何建立树状结构列表?
【发布时间】:2015-04-01 06:49:20
【问题描述】:

所以,我的问题是,我想构建这两个表的树:

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

谁能帮我解决递归问题?

【问题讨论】:

  • 你试过了吗???
  • 我尝试在“_”字符处分解父子名称,然后检查是否设置了分解数组的第二个或第三个元素。但它一团糟。

标签: php recursion tree structure


【解决方案1】:

您不需要在数据库中创建 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. 返回您找到的孩子的列表。

【讨论】:

  • 我如何将这个结构打印为列表?
  • @VaimanHunor 你可以遍历创建的数组,也可以使用函数并编写代码在函数内部打印。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多