我有一个带有父/子系统的数据库表。它需要能够拥有无限级别(即使它可能没有被使用,它需要拥有它)。
所以我有一个递归函数来创建一个大数组。该数组应该看起来 像:
array(
0 => array(
'id' => 1,
'name' => 'test1',
'children' => array(
0 => array(
'id' => 2,
'name' => 'test2',
'children' => array();
)
)
)
)
我目前有这个功能:
public function createArray($parent_id = null, $array = array())
{
foreach ($this->getNavigationItems($parent_id) as $group)
{
$child = $group['child'];
$group['children'] = array();
$array[] = $group;
if ($child)
{
$this->createArray($child, $group['children']);
}
}
return $array;
}
该表有一个子列和父列。子项用于父项,子项将父项的子列的值作为父列值。
但是,在我的情况下,children数组将为空。因此,如果我有2个项目,id为1,其中parent_id为NULL,2为parent_id为1,则我将只获得带有空子数组的ID 1,其中必须是包含ID 2的数组。
我做错了什么?
答案 0 :(得分:1)
您当前的结构似乎不太复杂。为什么要将孩子作为你职能的参考?您只需返回id为parent_id的所有元素并追加。
function createArray($parent_id) {
$t = [];
foreach ($this->getNavigationItems($parent_id) as $group) {
// do wathever you want with group...
// now call this method recursive and store the result in children
$group['children'] = createArray($group['id']);
$t[] = $group;
}
return $t;
}
答案 1 :(得分:0)
已经弄明白了:
public function createArray($parent_id = null, &$array = array())
{
foreach ($this->getNavigationItems($parent_id) as $group)
{
$child = $group['child'];
$children = array();
$group['children'] = &$children;
$array[] = $group;
if ($child)
{
$this->createArray($child, $children);
}
}
return $array;
}
我必须使数组参数成为引用。我还必须为孩子们制作一个单独的变量。该变量的引用将用作$group['children']
。 $children
将用作新参数。