具有递归功能的回声菜单树
Posted
技术标签:
【中文标题】具有递归功能的回声菜单树【英文标题】:Echo menu tree with recursive function 【发布时间】:2012-06-02 17:05:39 【问题描述】:问题:我想不出针对我的具体情况创建递归函数的方法。
情况:
mysql DB
id | root | name |
root
向女巫类别显示这是子类别。
html 应该是什么样子:
<li><a href="#"><p class="Tier0">Datori</p></a>
<ul style="display: block">
<li><a href="#"><p class="Tier1">Cookies</p></a></li>
<li><a href="#"><p class="Tier1">Events</p></a></li>
<li><a href="#"><p class="Tier1">Forms</p></a></li>
<li><a href="#"><p class="Tier1">Games</p></a></li>
<li><a href="#"><p class="Tier1">Images</p></a>
<ul>
<li><a href="#"><p class="Tier2">CSS</p></a></li>
<li><a href="#"><p class="Tier2">javascript</p></a></li>
<li><a href="#"><p class="Tier2">JQuery</p></a></li>
</ul>
</li>
<li><a href="#"><p class="Tier1">Navigations</p></a>
<ul>
<li><a href="#"><p class="Tier2">CSS</p></a></li>
<li><a href="#"><p class="Tier2">JavaScript</p></a></li>
<li><a href="#"><p class="Tier2">JQuery</p></a></li>
</ul>
</li>
<li><a href="#"><p class="Tier1">Tabs</p></a></li>
</ul>
</li>
<li><a href="#"><p class="Tier0">Washing Machines</p></a>
我需要什么样的 php 函数才能打印出来?
【问题讨论】:
看这个...***.com/questions/10215980/… 【参考方案1】:怎么样:
function recurse($categories, $parent = null, $level = 0)
$ret = '<ul>';
foreach($categories as $index => $category)
if($category['root'] == $parent)
$ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
$ret .= $this->recurse($categories, $category['id'], $level+1);
$ret .= '</li>';
return $ret . '</ul>';
此函数要求您首先查询数据库以获取可用类别的完整列表,并假定您的根类别的值为 null,但该函数可以更改为接受 -1 或 0,具体取决于您当前架构的工作方式.
$categories = get from database into an multi-dimensional array ;
$Tree = $this->recurse($categories);
echo $Tree;
您可以考虑执行以下操作,以防止在父级不存在子级时出现任何空 UL:
function recurse($categories, $parent = null, $level = 0)
$ret = '<ul>';
foreach($categories as $index => $category)
if($category['root'] == $parent)
$ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
$sub = $this->recurse($categories, $category['id'], $level+1);
if($sub != '<ul></ul>')
$ret .= $sub;
$ret .= '</li>';
return $ret . '</ul>';
但是,最好的解决方案是选择您的数据以包含一列,该列包含每个类别有多少子类别。
select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category
你的功能将是:
function recurse($categories, $parent = null, $level = 0)
$ret = '<ul>';
foreach($categories as $index => $category)
if($category['root'] == $parent)
$ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
if($category['ChildCount'] > 0)
$ret .= $this->recurse($categories, $category['id'], $level+1);
$ret .= '</li>';
return $ret . '</ul>';
希望有帮助吗?
【讨论】:
谢谢你!有一天我的啤酒,你刚刚救了我的*! :)以上是关于具有递归功能的回声菜单树的主要内容,如果未能解决你的问题,请参考以下文章