Php 如何解决错误:最大函数嵌套级别为';256';到达,中止?
我正在尝试分别创建嵌套类别主菜单和子菜单。 这是一个错误: 错误:已达到最大函数嵌套级别“256”,正在中止 我已经试过了这个答案中的一切: 但这对我不起作用,现在我的页面不断加载,并不断向页面添加黑名单点 这是代码,我想我在代码中做错了什么,但找不到哪里Php 如何解决错误:最大函数嵌套级别为';256';到达,中止?,php,nested-loops,Php,Nested Loops,我正在尝试分别创建嵌套类别主菜单和子菜单。 这是一个错误: 错误:已达到最大函数嵌套级别“256”,正在中止 我已经试过了这个答案中的一切: 但这对我不起作用,现在我的页面不断加载,并不断向页面添加黑名单点 这是代码,我想我在代码中做错了什么,但找不到哪里 $sql = "SELECT * FROM categories"; $stmt =$pdo->prepare($sql); $stmt->execute(); if($stmt->rowCount() > 0){
$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>";
}
在这里,我可以查看数据库中的数据:
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);
您的代码中确实存在一个问题,即您应该使用
$stmt->fetchAll()
来获取所有数据,而不是只获取一行的$stmt->fetch()
。然而,列表生成代码工作正常(),尽管它确实生成了一些空的
结构。您可以使用此函数简化此代码并删除这些代码。通过在第一次迭代中传递$parent\u 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);
函数绘图菜单($items,$parent\u id){
回声“\n\n”;
foreach($items作为$item){
如果($item['parent\u id']==$parent\u id){
echo“- ”$item['cat_name'];
//有孩子吗?
if(计数(数组\u键(数组\u列($items,'parent\u id'),$item['cat\u id'])){
绘图菜单($items,$item['cat_id']);
}
回声“
\n”;
}
}
回声“
\n”;
}
绘制菜单($items,0);
此函数对示例数据的输出如下所示:
- 安娜·赛法
- 教程
- 框架
- JSF
- 爪哇
- 生命射线
- 弹簧
- 冬眠
- 支柱
- 测试-测试-测试
- 测试2
- 网络服务
- 休息
- 肥皂
- 接触
- 关于
您能分享$items
结构和一些示例数据吗?感谢您的回答,添加了您需要提问的内容@NickGot谢谢,我在网站上的菜单需要两个不同的块状菜单和子菜单来添加html复选框等,我会尝试你的代码。@dilekkoç公平-这在你的代码中并不清楚,我总是喜欢简化!)请注意,您可能能够使用CSS实现这一要求,使用::before
或::after
基于菜单项的类别,我需要阅读更多关于fetch和fetchAll的内容。哈哈,非常感谢。@dilekkoç不用担心-我很高兴能提供帮助。
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);