如何在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()
的东西,但它似乎不是一个简单或快速的解决方案。
我没有找到这个信息,也许根本就不存在......
答案 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)
答案 3 :(得分:0)
private function select($modules, $level = 0)
{
$return_html = '';
$level_html = '';
$new_level = 0;
foreach($modules as $module)
{
$repeat = str_repeat(' ', $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
}
}