1

如何解决这个错误。“致命错误最大函数嵌套级别‘100’达到中止”

目前我将通过删除 php.ini 文件中的 "zend_extension = "/wamp/bin/php/php5.3.8/zend_ext/php_xdebug-2.1.2-5.3-vc9.dll" 来修复它。

但是托管会有问题。

它们是具有相同效率的递归函数的任何替代方案吗?:)

function MyFunction($pid)
{
echo "task..";
    $obj = MainObj->method($pid);

    if($obj)
    {
      foreach($obj as $val)
      {
         MyFunction($val->pid);
      }
    }
}

请帮我.. :)

4

2 回答 2

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()有任何副作用,两者之间的情况可能会有所不同。

于 2013-08-08T17:53:17.260 回答
1

您可以增加嵌套限制:

ini_set('xdebug.max_nesting_level', 1000);

于 2013-08-08T17:37:51.040 回答