Php 如何解决错误:最大函数嵌套级别为';256';到达,中止?

Php 如何解决错误:最大函数嵌套级别为';256';到达,中止?,php,nested-loops,Php,Nested Loops,我正在尝试分别创建嵌套类别主菜单和子菜单。 这是一个错误: 错误:已达到最大函数嵌套级别“256”,正在中止 我已经试过了这个答案中的一切: 但这对我不起作用,现在我的页面不断加载,并不断向页面添加黑名单点 这是代码,我想我在代码中做错了什么,但找不到哪里 $sql = "SELECT * FROM categories"; $stmt =$pdo->prepare($sql); $stmt->execute(); if($stmt->rowCount() > 0){

我正在尝试分别创建嵌套类别主菜单和子菜单。 这是一个错误:

错误:已达到最大函数嵌套级别“256”,正在中止

我已经试过了这个答案中的一切:

但这对我不起作用,现在我的页面不断加载,并不断向页面添加黑名单点

这是代码,我想我在代码中做错了什么,但找不到哪里

$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);