我试图分别做嵌套类别的主菜单和子菜单。 它给出了错误:
错误:达到最大功能嵌套级别“ 256”,正在中止! ?
我已经尝试了以下所有答案:Solution for "Fatal error: Maximum function nesting level of '100' reached, aborting!" in PHP
但是对我没有用,现在我的页面继续加载并继续在页面上添加黑名单点。
这是代码,我认为我在代码中做错了,但是找不到位置。
$sql = "SELECT * FROM categories";
$stmt =$pdo->prepare($sql);
$stmt->execute();
if($stmt->rowCount() > 0){
$rows = $stmt->fetch();
}else{
echo "Something went wrong";
}
unset($stmt);
$items = $rows;
echo "<ul>";
foreach($items as $item){
if($item['parent_id'] == 0){
echo "<li>".$item['cat_name'];
$id = $item['cat_id'];
sub($items, $id);
echo "</li>";
}
}
echo "</ul>";
function sub($items, $id){
echo "<ul>";
foreach($items as $item){
if($item['parent_id'] == $id){
echo "<li>".$item['cat_name'];
sub($items, $item['cat_id']);
echo "</li>";
}
}
echo "</ul>";
}
我正在本地使用wamp服务器。
编辑:这是mytable结构,我是usningphp 7.2.18
CREATE TABLE IF NOT EXISTS `categories` (
`cat_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`cat_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`seo_url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`parent_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
`place` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`cat_id`),
UNIQUE KEY `unique` (`cat_name`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
这是我数据库中的数据:
INSERT INTO `categories` (`cat_id`, `cat_name`, `seo_url`, `parent_id`, `place`) VALUES
(1, 'Ana Sayfa', '#', 0, 1),
(2, 'Tutorials', '#', 0, 1),
(3, 'Java', 'java', 6, 1),
(4, 'Liferay', 'liferay', 3, 1),
(5, 'Frameworks', '#', 0, 1),
(6, 'JSF', 'jsf', 5, 1),
(7, 'Struts', 'struts', 5, 1),
(8, 'Spring', 'spring', 6, 1),
(9, 'Hibernate', 'hibernate', 6, 1),
(10, 'Webservices', '#', 0, 1),
(11, 'REST', 'rest', 10, 1),
(12, 'SOAP', 'soap', 10, 1),
(13, 'Contact', 'contact', 0, 1),
(14, 'About', 'about', 0, 1),
(15, 'TEST-TEST-TEST', 'test', 5, 1),
(16, 'TEST2', 'test2', 15, 1);
答案 0 :(得分:0)
您的代码中确实有一个问题,那就是您应该使用$stmt->fetchAll()
来获取所有数据,而不是$stmt->fetch()
来仅获取一行。但是,您的列表生成代码可以正常工作(https://3v4l.org/HPP3s),尽管它确实会生成一些空的<ul></ul>
结构。您可以简化此代码,并使用此功能删除那些代码。通过为第一次迭代传递$parent_id = 0
,我们避免了像您那样需要两个单独的代码块。
function draw_menu($items, $parent_id) {
echo "\n<ul>\n";
foreach ($items as $item) {
if ($item['parent_id'] == $parent_id) {
echo "<li>" . $item['cat_name'];
// any children?
if (count(array_keys(array_column($items, 'parent_id'), $item['cat_id']))) {
draw_menu($items, $item['cat_id']);
}
echo "</li>\n";
}
}
echo "</ul>\n";
}
draw_menu($items, 0);
此函数对您的示例数据的输出如下:
<ul>
<li>Ana Sayfa</li>
<li>Tutorials</li>
<li>Frameworks
<ul>
<li>JSF
<ul>
<li>Java
<ul>
<li>Liferay</li>
</ul>
</li>
<li>Spring</li>
<li>Hibernate</li>
</ul>
</li>
<li>Struts</li>
<li>TEST-TEST-TEST
<ul>
<li>TEST2</li>
</ul>
</li>
</ul>
</li>
<li>Webservices
<ul>
<li>REST</li>
<li>SOAP</li>
</ul>
</li>
<li>Contact</li>
<li>About</li>
</ul>