我构建了一个包含网站菜单系统的数组:
$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
我陷入困境的地方是我现在正在寻求修改函数,以便我可以传入父页面并返回该父页面的子页面。
像这样:
function Build_Menu($menu_array,$is_sub,'Page 2'({ ...}
这将生成以下输出:
Page 2
Sub Page 1
或
function Build_Menu($menu_array,$is_sub,'Page 3'({ ...}
这将产生:
Page 3
Sub Page 2
Sub Page 3
重要的是,该函数保持递归,因此无论有多少子级别,它们都将作为函数的一部分输出。计划是每个页面的"显示"值将成为唯一标识符。
任何帮助将不胜感激,因为我已经为此兜圈子了几个小时!
非常感谢,詹姆斯。
这
看起来有点像重新发明轮子。您可能希望使用您选择的搜索引擎来查找"php 树结构"或查看 SPL 中的堆和双链表。http://www.php.net/manual/en/spl.datastructures.php
你不能这样做吗?
function Build_Sub_Menu($menu, $key) {
return Build_Menu(array($menu[$key]), false);
}
echo Build_Sub_Menu($menu, 'Page_2');
当然,您可以在Build_Menu
内部执行相同的操作,但我认为另一个功能更容易理解和维护。
您来验证$key
是否存在于$menu
中。