递归菜单构建在 php 中



我已经存储了我的菜单,如下所示。

id      label    link            parent  
------  -------  --------------  --------
    10  Home     http://cms.dev  10      
    11  About    http://about    11      
    12  History  http://history  11      
    13  Mission  http://mission  11      
    14  Contact  http://contact  14  

如何从表中递归生成 ul html 菜单,用于无限项目。

Home
About
  History
  Mission
Contact

什么是递归函数?是函数调用自身的时候。

在您的情况下,每个节点的项目看起来都是递归结构。是的,你有树,树可能会绕过递归管理器。

因此,请递归地执行此操作。例如,如果您有包含项目的纯数组$menu

$menu = [
    [
        'id' => 10,
        'label' => 'Home',
        'link' => 'http://cms.dev',
        'parent' => 10,
    ],
    [
        'id' => 11,
        'label' => 'About',
        'link' => 'http://about',
        'parent' => 11,
    ],
    [
        'id' => 12,
        'label' => 'History',
        'link' => 'http://history',
        'parent' => 11,
    ],
    [
        'id' => 13,
        'label' => 'Mission',
        'link' => 'http://mission',
        'parent' => 11,
    ],
    [
        'id' => 14,
        'label' => 'Contact',
        'link' => 'http://contact',
        'parent' => 14,
    ],
];

您可以使用功能进行菜单输出:

function echoMenu(&$menu, $parentId = null)
{
    echo '<ul>';
    foreach ($menu as &$item) {
        if ((!$parentId && $item['id'] == $item['parent']) 
            || ($item['parent'] == $parentId && $item['id'] != $item['parent'])) {
            echo '<li>';
            echo "<a href="${item['link']}">${item['label']}</a>";
            // Here is recursive call of echoMenu()
            echoMenu($menu, $item['id']);
            echo '</li>';
        }
    }
    echo '</ul>';
}
echoMenu($menu);

我向您的 etantion 支付为您的根节点使用'parent' => null声明更方便的东西。那么递归函数中的条件将更简单:

        if ($item['parent'] == $parentId) {

最新更新