您正在使用递归函数 - 很好。您应该坚持使用这种方法,但您无法控制何时打开和关闭特定的 ul,而这正是缺少的。
您会在下面找到我非常非常非常古老的废话,它应该给您一个关于在每个级别控制打开/关闭列表的过程的提示。
<?php
$query = mysql_query('SELECT menu.id, menu.id_parent, menu.link, menu.alt, library.title FROM library library, menu menu WHERE menu.link = library.id ORDER BY menu.level ASC');
while($row = mysql_fetch_array($query))
{
$menu_array[] = array('id'=>$row['id'], 'id_parent'=>$row['id_parent'], 'link'=>$row['link'], 'alt'=>$row['alt'], 'title'=>$row['title']);
}
function menu($id)
{
global $menu_array;
$has_childs = false;
$result = array();
// nothing if empty
if (empty($menu_array))
{
return;
}
foreach ($menu_array as $value)
{
if ($value['id_parent'] == $id)
{
$result[] = $value;
}
}
foreach ($result as $value)
{
if ($has_childs === false)
{
$has_childs = true;
if ($value['id_parent'] == 0)
{
echo ('<ul id="root">'); // root level
}
else
{
echo ('<ul>'); // sub levels
}
}
echo ('<li><a href="#">'.$value['title'].'</a>');
menu($value['id']);
echo ('</li>');
}
if ($has_childs === true)
{
echo ('</ul>');
}
}
menu(0);
再次调整它。删除查询并将其替换为您的 CI 模型返回的内容。看看结构是否相似。这是你给你的示例函数menu()。
编辑:
这是数据库结构。
CREATE TABLE IF NOT EXISTS `menu` (
`id` int(11) NOT NULL,
`id_parent` int(11) NOT NULL DEFAULT '0',
`link` int(11) NOT NULL DEFAULT '0',
`level` int(11) NOT NULL DEFAULT '0',
`alt` varchar(255) COLLATE utf8_polish_ci NOT NULL DEFAULT ''
) ENGINE=MyISAM AUTO_INCREMENT=74 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
--
-- Zrzut danych tabeli `menu`
--
INSERT INTO `menu` (`id`, `id_parent`, `link`, `level`, `alt`) VALUES
(66, 0, 197, 3, 'Strona główna'),
(3, 2, 199, 1, 'Kanał RSS'),
(4, 2, 200, 2, 'Archiwum newsów'),
(5, 0, 24, 6, 'Depeche Mode'),
(6, 5, 1, 1, 'Biografia grupy'),
(7, 10, 26, 1, 'Biografia'),
(8, 15, 94, 1, 'Biografia'),
(9, 19, 107, 1, 'Biografia'),
(10, 5, 25, 2, ''),
(11, 10, 27, 2, 'Albumy'),
(12, 10, 29, 3, 'Single'),
(13, 10, 30, 4, 'Video'),
(14, 10, 31, 5, 'Teksty'),
(15, 5, 93, 3, ''),
(16, 15, 95, 2, 'Albumy'),
(17, 15, 102, 3, 'Single'),
(18, 15, 103, 4, 'Teksty'),
(19, 5, 104, 4, ''),
(20, 19, 108, 2, 'Wytwórnia płytowa Toast Hawaii'),
(21, 19, 109, 3, 'Tost Hawajski'),
(22, 5, 105, 5, ''),
(23, 22, 111, 1, 'Biografia'),
(24, 22, 110, 2, 'Odejście z Depeche Mode'),
(26, 22, 221, 3, 'Albumy'),
(27, 22, 219, 4, 'Single'),
(28, 22, 220, 5, 'Teksty'),
(29, 5, 106, 6, ''),
(30, 29, 112, 1, 'Biografia'),
(31, 29, 113, 2, ''),
(32, 0, 55, 7, 'Dyskografia'),
(33, 32, 164, 1, 'Albumy'),
(34, 32, 165, 2, 'Single'),
(35, 32, 166, 3, 'Video'),
(36, 0, 17, 8, 'Teksty utworów'),
(37, 0, 53, 9, 'Trasy koncertowe'),
(38, 37, 76, 1, ''),
(39, 37, 77, 2, ''),
(40, 37, 78, 3, ''),
(41, 37, 79, 4, ''),
(42, 37, 80, 5, ''),
(43, 37, 81, 6, ''),
(44, 37, 82, 7, ''),
(45, 37, 83, 8, ''),
(46, 37, 84, 9, ''),
(47, 37, 85, 10, ''),
(48, 37, 86, 11, ''),
(49, 37, 87, 12, ''),
(50, 37, 88, 13, ''),
(51, 37, 89, 14, ''),
(52, 37, 90, 15, ''),
(53, 37, 91, 16, ''),
(54, 0, 201, 10, 'Ciekawostki'),
(55, 0, 202, 11, 'Fani'),
(56, 0, 203, 12, 'Forum'),
(57, 0, 42, 13, ''),
(58, 0, 196, 14, ''),
(59, 0, 41, 15, ''),
(60, 59, 204, 1, 'Kontakt'),
(61, 59, 277, 2, ''),
(62, 37, 282, 17, ''),
(63, 62, 280, 1, ''),
(67, 0, 198, 5, 'Aktualności'),
(68, 67, 199, 1, 'Kanał RSS'),
(69, 67, 200, 2, 'Archiwum newsów'),
(70, 62, 289, 2, ''),
(71, 55, 292, 1, ''),
(72, 56, 293, 1, '');
当然,请随意使用。 :) 就像我说的。这是非常旧的代码,但它完全可以工作。您可以看到完全粘贴的示例here。 Id 和 Id_parent - 这两个相互保持关系,将链接更改为您的 href 只是您将放入 href 的内容,level 是深度,alt 是菜单条目的标题。所以你有一些东西要清理,但它会 100% 工作。在 CI 中创建一个控制器,将查询部分移动到模型中的新方法,然后就可以了。生成列表后,您可以在视图中设置它的样式。 :)