如何在PHP函数中获取当前递归级别

时间:2013-11-12 09:55:08

标签: php recursion

如何在PHP函数中获取当前的递归级别?我的意思是,有这样的“神奇”(或最终正常)功能:

function doSomething($things) {
    if (is_array($things)) {
        foreach ($things as $thing) {
            doSomething($thing);
        }
    } else {
        // This is what I want :
        echo current_recursion_level();
    }
}

我知道我可以使用另一个函数参数(在此示例中为$level):

function doSomething($things, $level = 0) {
    if (is_array($things)) {
        foreach ($things as $thing) {
            $level++;
            doSomething($thing, $level);
        }
    } else {
        echo $level;
    }
}

但我想知道是否有内置函数(或技巧)来做到这一点。也许有debug_backtrace()的东西,但它似乎不是一个简单或快速的解决方案。

我没有找到这个信息,也许根本就不存在......

5 个答案:

答案 0 :(得分:8)

如果你只是想避免达到PHP的100级递归限制那么

count(debug_backtrace()); 

应该足够了。否则你没有选择传递深度参数,尽管precrement运算符使它更清晰,如下例所示。

function recursable ( $depth = 0 ) {
  if ($depth > 3) {
    debug_print_backtrace();
    return true;
  } else {
    return recursable( ++$depth );
  }
}

答案 1 :(得分:1)

你需要自己计算,唯一的选择是像XDebug那样描述你的完整软件。但这非常低效。

<?php

function my_recursive_fn($param) {
    static $counter = 0;
    if (is_array($param)) {
        ++$counter;
        foreach ($param as $k => $v) {

        }
    }
    else {
        echo $counter;
        --$counter;

        // If we're returning (only PHP 5.5+)
        try {
            return $counter;
        }
        finally {
            --$counter;
        }
    }
}

?>

这允许您在没有第二个公共参数的情况下进行计数。

答案 2 :(得分:0)

在java中,您可以检查调用堆栈。我想你可以在php中做同样的事情:

debug-backtrace这是你要找的那个吗?

由于php没有使用尾调用来优化递归,因此这应该会告诉你递归的深度。

答案 3 :(得分:0)

private function select($modules, $level = 0)
{
    $return_html = '';
    $level_html = '';
    $new_level = 0;
    
    foreach($modules as $module)
    {
        $repeat = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $level);
        
        if(!empty($module['children']))
        {
            $return_html .= '<option>'.$repeat.' '.$module['title'].'</option>';
            
            $new_level = $level+1;
            
            $return_html .= $this->select($module['children'], $new_level);
        }
        else
        {
            
            $return_html .= '<option>'.$repeat.' '.$module['title'].'</option>';
        }
    }
    
    return $return_html;
}

答案 4 :(得分:-1)

    function doSomething($things) {
static $level = 0;
    if (is_array($things)) {
        foreach ($things as $thing) {
$level++;
            doSomething($thing);
        }
    } else {
        // This is what I want :
        echo $level
    }
}