代码之家  ›  专栏  ›  技术社区  ›  robotmay

如何在多维数组中向上传播当前菜单项标志?

  •  1
  • robotmay  · 技术社区  · 14 年前

    我有一个通过多维数组构建的菜单。通过将当前项的url属性与当前请求匹配来设置当前项。我想让这个价值观向它的父母冒泡,但我不能让它在我的一生中发挥作用-我确信我已经很接近了,但事实证明这有点棘手。这是阵列:

    Array
    (
      [children] => Array
        (
            [Home] => Array
                (
                    [url] => /
                )
    
            [The Challenge] => Array
                (
                    [url] => /challenge
                )
    
            [The Finish] => Array
                (
                    [url] => /finish
                )
    
            [Latest News] => Array
                (
                    [url] => /latest_news
                )
    
            [Participants] => Array
                (
                    [url] => /participants
                    [children] => Array
                        (
                            [Some guy] => Array
                                (
                                    [url] => /participants/some_guy
                                    [children] => Array
                                        (
                                            [Hats] => Array
                                                (
                                                     [url] => /participants/some_guy/hats
                                                     [current] => 1
    

    实际上,我正在寻找一个函数,它将遍历每个项,直到找到[当前]标志,然后将该值传播回其父项。菜单中没有设置深度限制。

    对于上面的示例,它将导致:

    Array
    (
      [children] => Array
        (
            [Home] => Array
                (
                    [url] => /
                )
    
            [The Challenge] => Array
                (
                    [url] => /challenge
                )
    
            [The Finish] => Array
                (
                    [url] => /finish
                )
    
            [Latest News] => Array
                (
                    [url] => /latest_news
                )
    
            [Participants] => Array
                (
                    [url] => /participants
                    [current] => 1
                    [children] => Array
                        (
                            [Some guy] => Array
                                (
                                    [url] => /participants/some_guy
                                    [current] => 1
                                    [children] => Array
                                        (
                                            [Hats] => Array
                                                (
                                                     [url] => /participants/some_guy/hats
                                                     [current] => 1
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   user187291    14 年前

    喜欢

     function set_current($menu) {
        if(!is_array($menu)) return 0;
        if(isset($menu['current'])) return 1;
        foreach($menu as $sub) {
            if(set_current($sub))
                return $menu['current'] = 1;
        }
        return 0;
    }
    

    未测试,因为您发布的数据不适合测试(哦,天哪,为什么他们总是发布那些var_转储?)

        2
  •  1
  •   user187291    13 年前

    以下是修改后的工作版本:

    function set_current(&$menu) {
        if(!is_array($menu)) return false;
        if(isset($menu['current'])) return true;
        if(isset($menu['children'])){
            foreach($menu['children'] as $key => $value) {
                if(set_current($menu['children'][$key])){
                    $menu['current'] = true;
                    return true;
                }
            }
        }
        return false;
    }
    

    谢谢你的帮助;在过去的几天里,我一直很亲近,只是需要看它写得稍微有点不同才能完成。