假设我有一个表有一个代表树层次的水平记录的表
id group parent_group_id
--------- ---------- ---------------
1 Parent 1 NULL
2 Parent 2 NULL
3 Parent 3 NULL
4 Child 1 1
5 Child 2 2
6 Child 3 2
7 Child 4 6
我需要构建一个递归函数来构建一个多维嵌套数组,以便它从" top"首先构建parent_group_ids为NULL的行的顶级数组。快进几次迭代,我期待最终得到像这样的对象
$result = array(
[0] => array(
'id' => 1,
'group' => 'Parent 1',
'parent_group_id' => NULL,
'children' => array(
[0] => array(
'id' => 4,
'group' => 'Child 1'
'parent_group_id' => 1,
'children' => NULL)),
[1] => array(
'id' => 2,
'group' => 'Parent 2',
'parent_group_id' => NULL,
'children' => array(
[0] => array(
'id' => 5,
'group' => 'Child 2'
'parent_group_id' => 2,
'children' => NULL),
[1] => array(
'id' => 6,
'group' => 'Child 3'
'parent_group_id' => 2,
'children' => array(
[0] => array(
'id' => 1,
'group' => 'Child 4'
'parent_group_id' => 6,
'children' => NULL)))
构建这样的东西的最佳方法是什么?我需要确保它遍历每个分支"。我猜测它何时获得顶级父母的id,然后继续检查是否存在任何行,其中parent_group_id等于第一次运行中的每个id。 。然后,如果它找到孩子,获取那些孩子的id,然后再次检查以查看孩子是否存在。依此类推,直到它出来以便检查。
我并不精通foreach循环来完成这样的事情。
答案 0 :(得分:1)
查看此源代码。
我认为这个功能有点类似于你所要求的。
public function getAreaTree(array $elements, $parentId = null) {
$branch = array();
foreach ($elements as $element) {
if ($element['parent_id'] == $parentId) {
$children = getAreaTree($elements, $element['id']);
if ($children) {
$element['children'] = $children;
}
$branch[] = $element;
}
}
return empty($branch) ? null : $branch;
}
答案 1 :(得分:0)
您好我曾经在寻找相同的概念..
使用此代码。这对我有用。
function recursion($parent_id = '') {
$categories = array();
$this->db->from('category');
$this->db->where('parent_id', $parent_id);
$result = $this->db->get()->result_array();
if(count($result) > 0) {
foreach ($result as $c) {
$child = $this->recursion($c['category_id']);
if($child) {
$c ['children']= $child;
}
$categories[] = $c;
}
}
return $categories;
}
function get_cat() {
print_r($this->recursion());
}
这可以提高预加载所有类别的速度,从而跳过每个新parent_id的查询。
此函数的作用:使用给定的parent_id加载所有类别,遍历所有这些类别并递归存储在数组上。
但问题是,这会迫使您拥有类别的干净树结构。
希望它能帮助您解决问题。