PHP - 如何构建树结构列表?
PHP - How to build tree structure list?
所以,我的问题是,我想构建这两个表的树:
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 个 table,您可以像下面那样从一个 table 维护它
+-------+---------------+---------------------------+
| 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);
算法很简单:
- 取所有元素的数组和当前的idparent
(最初为 0/nothing/null/whatever)。
- 遍历所有元素。
- 如果一个元素的 parent_id 与你在 1. 中得到的当前 parent id 匹配,则该元素是 parent 的一个 child。把它放在你的清单上
当前 children(此处:$branch)。
- 用你刚刚在 3. 中识别的元素的 id 递归调用函数,即找到该元素的所有 children,
并将它们添加为 children 元素。
- Return 你找到的列表 children.
所以,我的问题是,我想构建这两个表的树:
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
- p_0
- q
有人可以帮我解决递归问题吗??
您不需要为此在数据库中创建 2 个 table,您可以像下面那样从一个 table 维护它
+-------+---------------+---------------------------+
| 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);
算法很简单:
- 取所有元素的数组和当前的idparent (最初为 0/nothing/null/whatever)。
- 遍历所有元素。
- 如果一个元素的 parent_id 与你在 1. 中得到的当前 parent id 匹配,则该元素是 parent 的一个 child。把它放在你的清单上 当前 children(此处:$branch)。
- 用你刚刚在 3. 中识别的元素的 id 递归调用函数,即找到该元素的所有 children, 并将它们添加为 children 元素。
- Return 你找到的列表 children.