php递归深度过大,导致内存溢出

qq_16170861 2018-12-02 12:14:47

function dealStr($str,&$result=array()){
$findComma = strpos($str,',');
if (!$findComma) {

$result[]=$str;
unset($str);
}else{

//获取字符串长度
$len = strlen($str);
//获取逗号后面的字符
$endOfComma = strstr($str,',');
$CommaLen = strlen($endOfComma);
$findrednik = strpos($endOfComma,';');
//截取','第一次出现位置之前的字符
$str1 = substr($str,0,$findComma);
$str2 = $str1.substr($endOfComma,$findrednik,$CommaLen);//结果1→3;2→3;3→1;4→3;5→0;6→1;7→1,2;9→3;14→0 1 2 9_1

$str3 = substr($str,0,$findComma-1);
$str4 = $str3.substr($str,$findComma+1,$len);//结果1→3;2→3;3→1;4→3;5→1,2;6→1;7→1,2;9→3;14→0 1 2 9_1
unset ($str);
dealStr($str2,$result);

dealStr($str4,$result);


}

return $result;

}

$str = '1→0,1,2;2→0,1,2;3→0,1,2;4→0,1,2;5→0,1,2;6→0,1,2;7→0,1,2;9→0,1,2;14→0,1,2 1 2 9_1';
$msg = dealStr($str);
print_r($msg);



Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes) in E:\WWW\test.php on line 70
...全文
519 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sweetgun 2018-12-05
  • 打赏
  • 举报
回复
$str2的处理有问题,没有判断$findrednik===false的情况,导致死循环。 另外,第一个判断if (!$findComma) 尽量不要这么做,strpos返回字符串第一次找到的位置(整数)或者false(没有找到),所以对于strpos的返回值,要判断是否找到,最好用if ($findComma === false)。 ps,如果你是想把逗号后面分号前面的东西去掉,可以用正则表达式来处理啊。
伟洪winni 2018-12-05
  • 打赏
  • 举报
回复
可以改成迭代或修改配置
PHP中的函数嵌套层数限制 : http://www.phppan.com/2011/06/php-function-nesting-level/
1.6 递归 尾递归 迭代 回调 : http://www.source-open.com/688200
DavidSun2014 2018-12-03
  • 打赏
  • 举报
回复
楼上说得对,这种问题建议把需求场景写出来,也许有其它思路实现。
xuzuning 2018-12-02
  • 打赏
  • 举报
回复
算法问题
在 dealStr 函数入口处检查传入的参数
echo $str,PHP_EOL;
可以看到
1→0,1,2;2→0,1,2;3→0,1,2;4→0,1,2;5→0,1,2;6→0,1,2;7→0,1,2;9→0,1,2;14→0,1,2 1 2 9_1
1→0;2→0,1,2;3→0,1,2;4→0,1,2;5→0,1,2;6→0,1,2;7→0,1,2;9→0,1,2;14→0,1,2 1 2 9_1
1→0;2→0;3→0,1,2;4→0,1,2;5→0,1,2;6→0,1,2;7→0,1,2;9→0,1,2;14→0,1,2 1 2 9_1
1→0;2→0;3→0;4→0,1,2;5→0,1,2;6→0,1,2;7→0,1,2;9→0,1,2;14→0,1,2 1 2 9_1
1→0;2→0;3→0;4→0;5→0,1,2;6→0,1,2;7→0,1,2;9→0,1,2;14→0,1,2 1 2 9_1
1→0;2→0;3→0;4→0;5→0;6→0,1,2;7→0,1,2;9→0,1,2;14→0,1,2 1 2 9_1
1→0;2→0;3→0;4→0;5→0;6→0;7→0,1,2;9→0,1,2;14→0,1,2 1 2 9_1
1→0;2→0;3→0;4→0;5→0;6→0;7→0;9→0,1,2;14→0,1,2 1 2 9_1
1→0;2→0;3→0;4→0;5→0;6→0;7→0;9→0;14→0,1,2 1 2 9_1 从这里开始就重复了。陷入了死循环
1→0;2→0;3→0;4→0;5→0;6→0;7→0;9→0;14→0,1,2 1 2 9_1

由于不知道你想做什么,无法提供有益的建议

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧