PHP递归无限分类内存溢出

发布于 2022-09-06 04:47:54 字数 489 浏览 36 评论 0

Allowed memory size of 33554432 bytes exhausted ..

之前一直用一直没出现问题,现在再用就报错了。之前是根据int的id来递归,现在根据varchar的用户名递归。并且现在才不到10条数据。是不是跟字段类型有关?

递归代码

function getTree($list, $parent_id, $level=0) {

    static $tree = array();
 
    foreach($list as $row) {
 
      if($row['pid'] == $parent_id) {

        $row['level'] = $level;
        
        $tree[] = $row;

        getTree($list, $row['id'], $level+1);
      }
   }
   return $tree;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

一袭水袖舞倾城 2022-09-13 04:47:54

可能原因:递归没有返回,从而无限递归,最终造成函数的调用栈溢出。

递归的两个基本条件:

  • 递归的退出条件。

  • 递推过程。

建议楼主贴出所传入的参数,或者自己在每次递归调用时,打印一下所传入的参数,看是不是因为数据结构问题造成了循环递归。

╰沐子 2022-09-13 04:47:54

应该是你的数据出现了问题,
也就是:
比如:
$list=array(
array('id'=>1,"name"=>"父类","pid"=>3),
array("id"=>2,"name"=>"子类","pid"=>1),
array("id"=>3,"name"=>"孙类","pid"=>2),
);

这样就会变成子子孙孙无穷尽也!!!!!

违心° 2022-09-13 04:47:54

1、PHP对递归是有限制的,递归次数过多就会出现溢出报错。
2、在理论上,所有的递归都可以用循环替代。
3、生成HTML树的难点在于html的闭合标签如:</ul>。

可以参考:PHP无限级分类的实现(不使用递归) http://www.cnblogs.com/rainma...

还不是爱你 2022-09-13 04:47:54

我跟一楼一样的看法,因为你用int类型id来递归,可能这个id是主键他不会重复,他是唯一的,得到了一批子孙。但是你用varchar可能某次递归的时候的到了两批,最可怕的是这两批中的数据互相有关系,导致你无限递归,内存溢出,然后over了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文