具有递归功能的回声菜单树 [英] Echo menu tree with recursive function
问题描述
问题:我无法想象对我的具体情况做一个递归函数。
情况:
Mysql DB
id | root |名称|
其中根
显示巫婆类别,这是子类别。
HTML应该如何显示:
< li>< a href =#>< p class =Tier0> Datori< / p>< / a>
< ul style =display:block>
< a>< a href =#>< p class =Tier1> Cookie< / p>< / a>< / li>
< a>< a href =#>< p class =Tier1>活动< / p>< / a>< / li>
< a>< a href =#>< p class =Tier1>表格< / p>< / a>< / li>
< a>< a href =#>< p class =Tier1>游戏< / p>< / a>< / li>
< li>< a href =#>< p class =Tier1>图片< / p>< / a>
< ul>
< a>< a href =#>< p class =Tier2> CSS< / li>< / a>< / li>
< a>< a href =#>< p class =Tier2> JavaScript< / p>< / a>< / li>
< a>< a href =#>< p class =Tier2> JQuery< / p>< / a>< / li>
< / ul>
< / li>
< a>< a href =#>< p class =Tier1> Navigations< / p>< / a>
< ul>
< a>< a href =#>< p class =Tier2> CSS< / li>< / a>< / li>
< a>< a href =#>< p class =Tier2> JavaScript< / p>< / a>< / li>
< a>< a href =#>< p class =Tier2> JQuery< / p>< / a>< / li>
< / ul>
< / li>
< a>< a href =#>< p class =Tier1>标签< / p>< / a>< / li>
< / ul>
< / li>
< a>< a href =#>< p class =Tier0>洗衣机< / p>< / a>
什么样的PHP函数我需要全部打印出来?
$ b $ 函数recurse($类别) ,$ 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->递归($ categories,$ category ['id'],$ level + 1);
$ ret。='< / li>';
}
}
返回$ ret。 < / UL>;
$ p 这个函数要求你首先在数据库中查询整个可用类别列表并假定您的根类别的值为null,但函数可以更改为接受-1或0,具体取决于当前模式的工作方式。
$ categories = {从数据库获取到多维数组中};
$ Tree = $ this->递归($ categories);
echo $ Tree;
您可能会考虑采取以下措施,以防止在没有孩子存在父母时出现任何空的UL:
函数递归($ 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>';
}
}
返回$ ret。 < / UL>;
}
然而,最好的解决方案是选择数据以包含一列包含每个类别有多少个子类别。
选择Category。*,(从select类别中选择count(distinct c1.id) c1,其中c1.root = Category.id)作为ChildCount从类别
其中您的函数是:
函数递归($ 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>';
}
}
返回$ ret。 < / UL>;
}
希望有帮助吗?
Problem: I can't think of way make a recursion function to my specific situation.
Situation:
Mysql DB
id | root | name |
Where root
shows to witch category this is subcategory.
How should HTML look:
<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>
What kind of PHP function I would need to print it all out?
解决方案 How about:
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>';
}
This function requires that you first query your database for the entire list of available categories and assumes that your root categories have a value of null, but the function can be changed to accept -1 or 0 depending on how your current schema works.
$categories = { get from database into an multi-dimensional array };
$Tree = $this->recurse($categories);
echo $Tree;
You may consider doing the following to prevent any empty UL's appearing when no children exist for the parent:
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>';
}
However, the best solution, would be to select your data to include a column containing how many child categories each category has.
select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category
In which your function would be:
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>';
}
Hope that helps?
这篇关于具有递归功能的回声菜单树的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!