我在很多帖子上搜索过,但我找不到一个可以解决我的问题。
在我的数据库中,我有一些数据:名称和“树路径”,如“1.1.2”。我没有父ID或类似的东西。所以我的问题是:有没有办法创建一个只有“treepath”的嵌套多级菜单?
在我的桌子上,我得到了(ID | NAME | TREEPATH):
...
我需要的输出:
<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的递归函数,但是我无法正确使用它,所以如果有人能帮我解决这个问题,那就太棒了!
谢谢!
答案 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图表,最终将其放入表格和视图中。