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

解决方案 »

  1.   

    算法问题
    在 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由于不知道你想做什么,无法提供有益的建议
      

  2.   

    可以改成迭代或修改配置
    PHP中的函数嵌套层数限制 : http://www.phppan.com/2011/06/php-function-nesting-level/
    1.6 递归 尾递归 迭代 回调 : http://www.source-open.com/688200
      

  3.   

    $str2的处理有问题,没有判断$findrednik===false的情况,导致死循环。另外,第一个判断if (!$findComma) 尽量不要这么做,strpos返回字符串第一次找到的位置(整数)或者false(没有找到),所以对于strpos的返回值,要判断是否找到,最好用if ($findComma === false)。ps,如果你是想把逗号后面分号前面的东西去掉,可以用正则表达式来处理啊。