首页  >  文章  >  数据库  >  如何使用递归函数从分层 MySQL 数据库表生成多级 HTML 菜单树?

如何使用递归函数从分层 MySQL 数据库表生成多级 HTML 菜单树?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-29 06:48:31534浏览

How can a recursive function be used to generate a multi-level HTML menu tree from a hierarchical MySQL database table?

使用递归函数回显菜单树

问题:
为特定数据结构构造递归函数是一个共同的挑战。这是需要递归函数来显示分层菜单的情况。

情况:
给定一个 MySQL 数据库表,其中根列指示每条记录的父类别,创建具有多个级别的 HTML 菜单树。所需的 HTML 结构为:

<code class="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></li></code>

函数:
生成 HTML 树结构的递归函数如下:

<code class="php">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>';
}</code>

执行:

<code class="php">// Fetch categories from the database
$categories = { get from database into a multi-dimensional array };

// Generate HTML tree
$Tree = $this->recurse($categories);

// Output the result
echo $Tree;</code>

优化:
防止空嵌套

    对于没有子类别的父类别元素,修改函数如下:
<code class="php">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>';
}</code>

为了获得最佳性能,可以考虑在数据库表中添加一个 ChildCount 列,表示每个父类别的子类别数量,并修改相应地发挥作用。这避免了递归期间不必要的数据库查找。

以上是如何使用递归函数从分层 MySQL 数据库表生成多级 HTML 菜单树?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn