PHP - 如何构建树结构列表?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/29384548/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
PHP - How to build tree structure list?
提问by Vaiman Hunor
So, my problem is, that I want to build a tree of these 2 tables:
所以,我的问题是,我想构建这两个表的树:
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 |
+-------+---------------+---------------------------+
And the Tree should look like:
树应该看起来像:
- p
- p_0
- p_0_0
- p_0_1
- p_0_1_0
- p_0_1_1
- p_0
- q
- 磷
- p_0
- p_0_0
- p_0_1
- p_0_1_0
- p_0_1_1
- p_0
- q
Can anybody help me out with a recursive solution??
有人可以帮我解决递归解决方案吗?
回答by Veerendra
You do not need to create 2 tables in the database for this you can maintain it like below from one table only
您不需要在数据库中创建 2 个表,您可以仅从一个表中维护它,如下所示
+-------+---------------+---------------------------+
| id | parent_id | title |
+-------+---------------+---------------------------+
| 1 | 0 | Parent Page |
| 2 | 1 | Sub Page |
| 3 | 2 | Sub Sub Page |
| 4 | 0 | Another Parent Page |
+-------+---------------+---------------------------+
The array generated will be like
生成的数组将类似于
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
)
)
You need to use the below recursive function to achieve it
您需要使用以下递归函数来实现它
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);
The algorithm is pretty simple:
算法非常简单:
- Take the array of all elements and the id of the current parent (initially 0/nothing/null/whatever).
- Loop through all elements.
- If the parent_id of an element matches the current parent id you got in 1., the element is a child of the parent. Put it in your list of current children (here: $branch).
- Call the function recursively with the id of the element you have just identified in 3., i.e. find all children of that element, and add them as children element.
- Return your list of found children.
- 获取所有元素的数组和当前父级的 id(最初为 0/nothing/null/whatever)。
- 循环遍历所有元素。
- 如果元素的 parent_id 与您在 1. 中获得的当前父 ID 匹配,则该元素是父元素的子元素。把它放在你当前孩子的列表中(这里:$branch)。
- 使用您刚刚在 3. 中标识的元素的 id 递归调用该函数,即找到该元素的所有子元素,并将它们添加为子元素。
- 返回您找到的孩子的名单。