具有递归功能的回声菜单树

Posted

技术标签:

【中文标题】具有递归功能的回声菜单树【英文标题】:Echo menu tree with recursive function 【发布时间】:2012-06-02 17:05:39 【问题描述】:

问题:我想不出针对我的具体情况创建递归函数的方法。

情况:

mysql DBid | 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>';

希望有帮助吗?

【讨论】:

谢谢你!有一天我的啤酒,你刚刚救了我的*! :)

以上是关于具有递归功能的回声菜单树的主要内容,如果未能解决你的问题,请参考以下文章

java从数据库读取菜单,递归生成菜单树

递归加载菜单树

使用Oracle数据库的递归查询语句生成菜单树

vue.js 树菜单 递归组件树来实现

Django第10章: 权限管理(递归菜单树)

Vue.js怎样把递归组件构建为树形菜单