How to get current recursion level in a PHP function

偶尔善良 提交于 2019-12-30 18:34:42

问题


How to get current recursion level in a PHP function ? I mean, is there any "magical" (or eventually normal) function like this :

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

I know I can use another function argument ($level in this example) :

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

But I want to know if there is a built-in function (or trick) to do that. Maybe something with debug_backtrace(), but it does not seem to be a simple or quick solution.

I did not found this info, maybe it simply does not exists...


回答1:


If you are just looking to avoid hitting PHP's 100 level recursion limit then

count(debug_backtrace()); 

should be sufficient. Otherwise you've no choice to pass a depth argument, though the precrement operator makes it somewhat cleaner as seen in the example below.

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



回答2:


You need to count it yourself, the only alternative would be something like XDebug which profiles your complete software. But this is highly inefficient.

<?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;
        }
    }
}

?>

This allows you to count without a second public parameter.




回答3:


In java you can inspect the call stack. I think you can do the same in php:

debug-backtrace Is this the one you are looking for?

Since php does not optimize recursion with tail calls this should tel you the depth of the recursion.




回答4:


    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
    }
}


来源:https://stackoverflow.com/questions/19925970/how-to-get-current-recursion-level-in-a-php-function

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!