如何解决错误:达到最大功能嵌套级别“ 256”,正在中止?

时间:2019-11-17 22:51:32

标签: php nested-loops

我试图分别做嵌套类别的主菜单和子菜单。 它给出了错误:

  

错误:达到最大功能嵌套级别“ 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);

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

Demo on 3v4l.org

此函数对您的示例数据的输出如下:

<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>