我正在寻找最好的方法来创建一个复杂的导航元素的动态。我有一个数据库中的所有元素(标题、id、parentId),我希望有效地将它们从DB中取出并正确地显示出来。我还想折叠所有不活动的导航元素。所以,如果我浏览“沙发”,我不会看到“吊灯”或照明下的任何类别,但我会看到“照明”。
这就是我想要的最终产品的样子:
- Bedroom
- Beds
- Nightstands
我现在的方法是
我试图用尽可能少的插话来实现这个目标,而且我确信我现在的代码效率很低。尤其是步骤2,我多次迭代数组。必须有一个通用的解决方案(常见?)问题来了。
发布于 2012-01-16 07:19:12
考虑向数据库表中添加一个新字段:level。
主-类别将有level 0。
子类别将有level 1。
子类别将有level 2.
等。
这个技巧将帮助您知道哪些子类别需要禁用,而不需要数组的第二次迭代。
发布于 2012-01-16 09:07:45
我相信这是使用递归生成html代码的完美地方。我不久前用过这个功能。它正在使用多维数组(树)。
function buildMenu($menu_array, $is_sub=FALSE) {
$attr = (!$is_sub) ? 'id="menu"' : 'class="submenu"';
$menu = "<ul $attr>\n";
foreach($menu_array as $id => $elements) {
foreach($elements as $key => $val) {
if(is_array($val)) {
$sub = buildMenu($val, TRUE);
}
else {
$sub = NULL;
$$key = $val;
}
}
if(!isset($url)) {
$url = $id;
}
$menu .= "<li><a href=\"$url\">$display</a>$sub</li>\n";
unset($url, $display, $sub);
}
return $menu . "</ul>\n";
}
echo buildMenu($menu_array); 这也增加了css属性。如果希望标记当前活动的页面,可以使用strpos()函数查找当前的url。如果您需要更多的功能,可以轻松地将它们添加到buildMenu()中。
使用上面的答案中提到的水平也会有帮助。如果您在数据库中使用嵌套的set模型,我也可以帮助您进行查询,这是一个返回整个菜单数据的单个选择。
https://stackoverflow.com/questions/8233699
复制相似问题