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'];

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

报告相同问题?

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同