dt2002 2017-01-12 02:50
浏览 32
已采纳

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

Given this array:

$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'
            ),
        )
    ),
);

I would like to add path to each node in the array like this:

$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',
                    ),
                )
            ),
        );

This menu item array only has 2 levels but it can have more levels.

What I have tried:

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);
        }
    }
}

This does not work as expected, it can be viewed here: http://ideone.com/sHdhss

  • 写回答

1条回答 默认 最新

  • douzhe9075 2017-01-12 03:49
    关注

    A simple recursive function is all you need. It will keep track of the path and update the items as it moves through the array.

    $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);
    

    Edit: now that you've posted your code I can see you're pretty close to what I came up with. Your problem was that you were appending to the path each time, so it kept getting longer: $path = $path . '/' . $menu_item['key'];

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集
  • ¥15 在启动roslaunch时出现如下问题
  • ¥15 汇编语言实现加减法计算器的功能
  • ¥20 关于多单片机模块化的一些问题
  • ¥30 seata使用出现报错,其他服务找不到seata
  • ¥35 引用csv数据文件(4列1800行),通过高斯-赛德尔法拟合曲线,在选取(每五十点取1点)数据,求该数据点的曲率中心。
  • ¥20 程序只发送0X01,串口助手显示不正确,配置看了没有问题115200-8-1-no,如何解决?
  • ¥15 Google speech command 数据集获取
  • ¥15 vue3+element-plus页面崩溃