如何创建没有父ID的嵌套多级菜单

时间:2014-03-05 20:48:07

标签: php html drop-down-menu

我在很多帖子上搜索过,但我找不到一个可以解决我的问题。

在我的数据库中,我有一些数据:名称和“树路径”,如“1.1.2”。我没有父ID或类似的东西。所以我的问题是:有没有办法创建一个只有“treepath”的嵌套多级菜单?

在我的桌子上,我得到了(ID | NAME | TREEPATH):

  • 0 |电话| 1
  • 1 |三星| 1.1
  • 2 | Galaxy S | 1.1.1
  • 3 | Galaxy Note | 1.1.2

...

我需要的输出:

<ul>
  <li><a href="">1. Phones</a>
  <ul>
      <li><a href="">1.1. Samsung</a>
      <ul>
         <li><a href="">1.1.1. Galaxy S</a></li>
         <li><a href="">1.1.2. Galaxy Note</a></li>
         <li><a href="">1.1.3. Galaxy Ace</a></li>
       </ul></li>
        <li><a href="">1.2. Apple</a></li>
        <li><a href="">1.3. Google</a></li>
    </ul></li>
</ul>

我当然需要一个带有PHP的递归函数,但是我无法正确使用它,所以如果有人能帮我解决这个问题,那就太棒了!

谢谢!

3 个答案:

答案 0 :(得分:0)

好吧,你可以使用一个使用正则表达式的递归函数,但这可能是次优的。伪代码如下:

function drawTree($root) {
  while($results = yourQuery("SELECT * FROM table WHERE treepath REGEXP '^{$root}\.'")) {
    echo "stuff";
    drawTree($results['treepath']);
  }  
}

答案 1 :(得分:0)

你的情况很奇怪。

我没有看到技术原因不在表中只有父ID。或者使用第一个普通形式。觉得有点做作,但你可以这样做:

<?php
$db = new mysqli(...);
$stmnt = $db->prepare("select name, treepath, LENGTH(treepath) - LENGTH(REPLACE(treepath, '.', '')) AS depth from tree order by treepath");
$stmnt->bind_result($name,$treepath,depth);
$tree = array();
$current_depth = 0;
while($stmnt->fetch())
{
  if($current_depth < $depth)
  {
    echo '<ol><li>' . $name . '</li>';
    $current_depth=$depth;
  }
  else if($current_depth == $depth)
  {
    echo '<li>' . $name . '</li>';
  }
  else //current_depth greater than depth
  {
    echo '</ol><li>' . $name .'</li>';
  }
}
$stmnt->close();
$db->close();
echo '</ol>';
?>

未经测试,需要tweeks。

答案 2 :(得分:-1)

如果您的应用程序需要提供嵌套菜单,那么最好在数据库中实现嵌套(在数据库语言中,它可以是分组,外键和约束)。在表示层和数据库层中维护不同的设计是不推荐。毕竟,强大的数据库设计对任何应用程序都至关重要,不是吗?

还有许多其他优点 - 您简化了应用程序设计,数据保持整齐有序,将数据库内容转换为演示文稿内容的工作量更少,并且添加新功能也变得更加容易。为什么不从一些分类和良好的模式设计开始呢?

如果你问我,我会做一个类似于“phones”表格的电话名称,年份,制造商,型号,类型等。 同样,会有一个名为manufacturers的不同表格,其中包含manufacturer id's, names, years和其他信息。您还可以使用另一个“type”表。电话表中的foreign key relationships列与其他列/表的类似内容之间会有manufacturer id's and manufacturer。如果你感到困惑,一个好的起点就是绘制一个E-R图表,最终将其放入表格和视图中。