PHP递归数组推送

时间:2017-05-04 11:47:18

标签: php arrays recursion

我有一个带有父/子系统的数据库表。它需要能够拥有无限级别(即使它可能没有被使用,它需要拥有它)。

所以我有一个递归函数来创建一个大数组。该数组应该看起来  像:

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的数组。

我做错了什么?

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将用作新参数。