如何在PHP中递归地重新映射数组?

如何在PHP中递归地重新映射数组?,php,recursion,Php,Recursion,如何递归地将子节点重新映射到节点?我尝试编写递归函数,但它只运行一次迭代。数组映射-仅对单个维度运行 我使用嵌套集模型输入是通过转储所有层次结构生成的 $array = Category::where('name', '=', 'All')->first()->getDescendantsAndSelf()->toHierarchy()->toArray(); /* Input */ $array = array( 'category_id' => 0, 'chi

如何递归地将子节点重新映射到节点?我尝试编写递归函数,但它只运行一次迭代。数组映射-仅对单个维度运行

我使用嵌套集模型输入是通过转储所有层次结构生成的

$array = Category::where('name', '=', 'All')->first()->getDescendantsAndSelf()->toHierarchy()->toArray();

/* Input */
$array = array(
'category_id' => 0,
'children' => array(
    array(
        'category_id' => 1,
        'children' => array(
            'category_id' => 2,
            'children' => array(
                'category_id' => 3,
            )
        )
    ),
    array(
        'category_id' => 4,
        'children' => array(
            'category_id' => 5,
            'children' => array(
                'category_id' => 6,
            )
        )
    )
)
);
输出应该是

/*
$array = array(
'category_id' => 0,
'nodes' => array(
    array(
        'category_id' => 1,
        'nodes' => array(
            'category_id' => 2,
            'nodes' => array(
                'category_id' => 3,
            )
        )
    ),
    array(
        'category_id' => 4,
        'nodes' => array(
            'category_id' => 5,
            'nodes' => array(
                'category_id' => 6,
            )
        )
    )
)
);*/


function remap($items){
    if(!empty($items['children'])){
        $items['nodes'] = $items['children'];
        unset($items['children']);
        return remap($items['nodes']);
    }
    else{
        return $items;

    }
}
print_r(remap($array));

有点复杂的原因,
childrens
内容因深度而异

function remap(array &$items){
    if(array_key_exists('children',$items)){
        $items['nodes'] = $items['children'];
        unset($items['children']);
        if(array_key_exists('children',$items['nodes'])){
            $items['nodes']['nodes'] = $items['nodes']['children'];
            unset($items['nodes']['children']);
        }
        foreach ($items['nodes'] as  &$x) {
            if (is_array($x)) {
                remap($x);
            }
        }
    }
    else{
        return $items;

    }
}
remap($array);
print_r($array);

此功能将
子项
键更改为
节点

function remap($items) {
    $result = array();
    foreach ($items as $key => $value) {
        if ($key == 'children') {
            $result['nodes'] = remap($value);
        } else {
            $result[$key] = $value;
        }
    }
    return $result;
}

$new_array = remap($array);

但是在你的评论之后,在您的Eloquent模型中创建一个将
子对象映射到
节点的访问器,并在获取集合的select中使用该访问器似乎更容易。

为什么将
子对象
键更改为
节点
?我必须重新映射Eloquent集合,以便为treeview插件输出json。插件要求数据采用指定格式谢谢,这个解决方案很有效。也许你知道一个特定于嵌套集的解决方案?对不起,我不明白你问的是什么,也许有一种方法可以扩展Baum\Node以获得相同的结果,我看到了,但是代码太多了,我的时间太少了