0

我建立了一个包含网站菜单系统的数组:


$menu = array(
    'Page_1' => array(
        'display' => 'Page 1'
    ),
    'Page_2' => array(
        'display' => 'Page 2',
        'sub' => array(
            'Sub_Page_1' => array(
                'display' => 'Sub Page 1'
            )
        )
    ),
    'Page_3' => array(
        'display' => 'Page 3',
        'sub' => array(
            'Sub_Page_2' => array(
                'display' => 'Sub Page 2'
            ),
            'Sub_Page_3' => array(
                'display' => 'Sub Page 3'
            )
        )
    )
);

我正在使用以下函数将菜单系统解析并输出为嵌套无序列表。


function Build_Menu($menu_array,$is_sub){

    $attr = (!$is_sub) ? ' class="menu"' : ' class="submenu"';
    $menu = "<ul$attr>";

    foreach($menu_array as $id => $properties){

        foreach($properties as $key => $val){

            if(is_array($val)){
                $sub = Build_Menu($val,TRUE);
            }
            else{
                $sub = NULL;
                $$key = $val;
            }
        }

        $menu .= '<li><a href="#">'.$display.'</a>'.$sub.'</li>';

        unset($url, $display, $sub);

    }

    return $menu . "</ul>";

}

这可以正常工作并生成如下列表:

Page 1
Page 2
    Sub Page 1
Page 3
    Sub Page 2
    Sub Page 3

我卡住的地方是我现在正在寻找修改函数,以便我可以传入父页面并返回该父页面的子页面。

就像是:

函数 Build_Menu($menu_array,$is_sub,'Page 2'){ ... }

这将生成以下输出:

Page 2
    Sub Page 1

或者

函数 Build_Menu($menu_array,$is_sub,'Page 3'){ ... }

这将产生:

Page 3
    Sub Page 2
    Sub Page 3

重要的是该函数保持递归,因此无论它们有多少子级别,它们都将作为函数的一部分输出。计划是每个页面的“显示”值将是唯一标识符。

任何帮助将不胜感激,因为我已经为此转了几个小时!

非常感谢,詹姆斯。

4

2 回答 2

0

这看起来有点像重新发明轮子。您可能希望使用您选择的搜索引擎来查找“php 树结构”或查看 SPL 中的堆和双链表。http://www.php.net/manual/en/spl.datastructures.php

于 2012-05-03T13:11:19.513 回答
0

你就不能这样吗?

function Build_Sub_Menu($menu, $key) {
   return Build_Menu(array($menu[$key]), false);
}

echo Build_Sub_Menu($menu, 'Page_2');

当然你可以在里面做同样的事情Build_Menu,但我认为另一个功能更容易理解和维护。

由您来验证是否$key存在于$menu.

于 2012-05-03T13:20:36.267 回答