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

时间:2015-04-24 19:00:26

标签: php recursion

如何以递归方式将子节点重新映射到节点?我尝试编写递归函数,但它只运行一次迭代。数组地图 - http://php.net/manual/en/function.array-map.php仅适用于单维

我正在使用嵌套集模型https://github.com/etrepat/baum#getting-started通过转储所有层次结构

生成输入
$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));

2 个答案:

答案 0 :(得分:1)

有点复杂,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);

答案 1 :(得分:0)

此功能会将children键更改为nodes

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模型中将children映射到nodes的访问者,并在获取您的集合的选择中使用它。