首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态创建动态Nav

动态创建动态Nav
EN

Stack Overflow用户
提问于 2011-11-22 20:55:04
回答 2查看 191关注 0票数 3

我正在寻找最好的方法来创建一个复杂的导航元素的动态。我有一个数据库中的所有元素(标题、id、parentId),我希望有效地将它们从DB中取出并正确地显示出来。我还想折叠所有不活动的导航元素。所以,如果我浏览“沙发”,我不会看到“吊灯”或照明下的任何类别,但我会看到“照明”。

这就是我想要的最终产品的样子:

  • 家具
    • 客厅
      • 沙发
      • 椅子
      • 奥斯曼人

代码语言:javascript
复制
- Bedroom 
    - Beds
    - Nightstands

  • 照明
    • 吊灯
    • 地板灯
    • 党卫军

  • 地毯及纺织品
    • 当代
    • 复古

我现在的方法是

  1. 编写一个SQL查询,该查询将提取所有类别名称、ids和父ids。
  2. 迭代这些类别并放入一个排序的多维数组中,其子类别存储在它们的父级下。
  3. 遍历新数组并添加另一个条目,将适当的类别标记为打开(默认情况下所有类别都关闭)
  4. 遍历数组并编写HTML

我试图用尽可能少的插话来实现这个目标,而且我确信我现在的代码效率很低。尤其是步骤2,我多次迭代数组。必须有一个通用的解决方案(常见?)问题来了。

EN

回答 2

Stack Overflow用户

发布于 2012-01-16 07:19:12

考虑向数据库表中添加一个新字段:level

主-类别将有level 0。

子类别将有level 1。

子类别将有level 2.

等。

这个技巧将帮助您知道哪些子类别需要禁用,而不需要数组的第二次迭代。

票数 2
EN

Stack Overflow用户

发布于 2012-01-16 09:07:45

我相信这是使用递归生成html代码的完美地方。我不久前用过这个功能。它正在使用多维数组(树)。

代码语言:javascript
复制
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模型,我也可以帮助您进行查询,这是一个返回整个菜单数据的单个选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8233699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档