我已经存储了我的菜单,如下所示。
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) {