为了账号安全,请及时绑定邮箱和手机立即绑定

PHP递归无限分类内存溢出

PHP递归无限分类内存溢出

PHP
jeck猫 2019-03-18 16:56:11
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; }
查看完整描述

4 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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

递归的两个基本条件:

  • 递归的退出条件。

  • 递推过程。

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

查看完整回答
反对 回复 2019-03-18
?
达令说

TA贡献1821条经验 获得超6个赞

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

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

查看完整回答
反对 回复 2019-03-18
?
守着一只汪

TA贡献1872条经验 获得超3个赞

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

查看完整回答
反对 回复 2019-03-18
  • 4 回答
  • 0 关注
  • 806 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信