我们如何在数组中添加子项的路径?

时间:2017-01-12 02:50:05

标签: php arrays algorithm menu

鉴于此数组:

$menu_items = array(
    array(
        'key' => 'aaa',
        'children' => array(
            array(
                'key' => 'www'
            ),
            array(
                'key' => 'xxx'
            ),
        )
    ),
    array(
        'key' => 'bbb',
        'children' => array(
            array(
                'key' => 'yyy'
            ),
            array(
                'key' => 'zzz'
            ),
        )
    ),
);

我想像这样添加数组中每个节点的路径:

$menu_items = array(
            array(
                'key' => 'aaa',
                'path' => 'aaa',
                'children' => array(
                    array(
                        'key' => 'www',
                        'path' => 'aaa/www'
                    ),
                    array(
                        'key' => 'xxx',
                        'path' => 'aaa/xxx'
                    ),
                )
            ),
            array(
                'key' => 'bbb',
                'path' => 'bbb',
                'children' => array(
                    array(
                        'key' => 'yyy',
                        'path' => 'bbb/yyy',
                    ),
                    array(
                        'key' => 'zzz',
                        'path' => 'bbb/zzz',
                    ),
                )
            ),
        );

此菜单项数组只有2个级别,但可以有更多级别。

我尝试过:

function add_menu_item_path(&$menu_data, $path = '') {

    foreach ($menu_data as &$menu_item) {
        $path = $path . '/' . $menu_item['key'];
        $menu_item['path'] = $path;
        if (!empty($menu_item['children'])) {
            add_menu_item_path($menu_item['children'], $path);
        }
    }
}

这不能按预期工作,可以在这里查看: http://ideone.com/sHdhss

1 个答案:

答案 0 :(得分:1)

您只需要一个简单的递归函数。它将跟踪路径并在项目移动数组时更新项目。

$menu_items = [
    ["key"=>"aaa","children"=>[["key"=>"www"], ["key"=>"xxx"]]],
    ["key"=>"bbb", "children"=>[["key"=>"yyy"], ["key"=>"zzz"]]]
];

function add_path(&$menu, $path = "") {
    if (!is_array($menu)) {
        return false;
    }
    foreach ($menu as &$item) {
        if (is_array($item) && array_key_exists("key", $item)) {
            $item["path"] = trim("$path/$item[key]", "/");
        }
        if (array_key_exists("children", $item) && is_array($item["children"])) {
            add_path($item["children"], "$path/$item[key]");
        }
    }
}

add_path($menu_items);
print_r($menu_items);

编辑:既然你已经发布了你的代码,我可以看到你非常接近我的想法。你的问题是你每次都要追加到路径上,所以它会持续变长:$path = $path . '/' . $menu_item['key'];