在PHP中递归菜单构建

时间:2016-01-16 10:40:35

标签: 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

1 个答案:

答案 0 :(得分:0)

什么是递归函数?当函数自己调用时。

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

所以,递归地做。例如,如果您有包含项目的简单数组$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) {