如何解决此错误。 “致命错误最大函数嵌套级别'100'达到了中止”
目前我会通过删除修复它 “zend_extension =”/ wamp/bin/php/php5.3.8/zend_ext/php_xdebug-2.1.2-5.3-vc9.dll“ 在php.ini文件中。
但托管会出现问题。
他们的递归函数的替代品是否具有相同的效率? :)
function MyFunction($pid)
{
echo "task..";
$obj = MainObj->method($pid);
if($obj)
{
foreach($obj as $val)
{
MyFunction($val->pid);
}
}
}
请帮帮我.. :)
答案 0 :(得分:2)
您可以使用堆栈并跳过递归。如果以相反的顺序将子元素添加到堆栈中,那么您应该获得与递归版本相同的顺序。如果顺序无关紧要,则无需反转迭代。
您不必理解输出的含义(因为它没有),而只关注将recurse
函数重写为iter
函数。
<?php
function getObj($n)
{
return $n ? new Foo($n) : null;
}
class Foo implements IteratorAggregate
{
public $n;
public function __construct($n)
{
$this->n = $n;
}
public function getIterator()
{
$values = [];
for ($i = 0; $i < $this->n; ++$i)
{
$values[] = (int) ($i / 2);
}
return new ArrayIterator($values);
}
}
function recurse($n)
{
$obj = getObj($n);
if ($obj)
{
echo "n => ", $obj->n, "\n";
foreach ($obj as $val)
{
recurse($val);
}
}
}
function iter($n)
{
$stack = [];
$obj = getObj($n);
if ($obj)
{
$stack[] = $obj;
}
while ($stack)
{
$obj = array_pop($stack);
echo "n => ", $obj->n, "\n";
foreach (array_reverse(iterator_to_array($obj)) as $val)
{
$obj = getObj($val);
if ($obj)
{
$stack[] = $obj;
}
}
}
}
recurse(10);
echo "-----\n";
iter(10);
请注意,它们会提供相同的输出,但如果getObj()
有任何副作用,则两者之间可能会有所不同。
答案 1 :(得分:1)
您可以增加嵌套限制:
ini_set('xdebug.max_nesting_level', 1000);