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 三菱伺服电机按启动按钮有使能但不动作
  • ¥20 为什么我写出来的绘图程序是这样的,有没有lao哥改一下
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号