【问题标题】:how to solve Error: Maximum function nesting level of '256' reached, aborting?如何解决错误:达到“256”的最大函数嵌套级别,正在中止?
【发布时间】:2019-11-17 22:51:32
【问题描述】:

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

错误:已达到“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结构,我使用的是php 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);

【问题讨论】:

  • 你能分享$items结构和一些示例数据吗?
  • 感谢您的回答,添加了您需要提问的内容。 @尼克

标签: php nested-loops


【解决方案1】:

您的代码中确实存在一个问题,即您应该使用$stmt-&gt;fetchAll() 来获取所有数据,而不是$stmt-&gt;fetch(),它只会获取一行。但是,您的列表生成代码可以正常工作 (https://3v4l.org/HPP3s),尽管它确实会生成一些空的 &lt;ul&gt;&lt;/ul&gt; 结构。您可以使用此函数简化此代码并删除这些代码。通过在第一次迭代中传递$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>

【讨论】:

  • 谢谢,我在站点中的菜单需要两个不同的块,例如菜单和子菜单,以不同方式添加 html 复选框等,我会尝试您的代码。
  • @dilekkoç 很公平 - 从您的代码中并不清楚,我总是喜欢简化! :-) 请注意,您可能可以根据菜单项的类使用 ::before::after 使用 CSS 来实现该要求
  • 我需要阅读更多关于 fetch 和 fetchAll 的内容。lol 非常感谢。
  • @dilekkoç 别担心 - 我很高兴能帮上忙。
猜你喜欢
  • 2019-03-23
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2017-11-14
  • 2021-08-28
  • 1970-01-01
相关资源
最近更新 更多