8

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()、しかしそれは単純または迅速な解決策ではないようです。

この情報は見つかりませんでした。たぶんそれは単に存在しない...

4

5 に答える 5

9

PHP の 100 レベルの再帰制限に達しないようにするだけの場合は、

count(debug_backtrace()); 

十分なはずです。それ以外の場合は、深さの引数を渡す選択肢はありませんが、以下の例に示すように、プリクリメント演算子を使用すると多少きれいになります。

function recursable ( $depth = 0 ) {
  if ($depth > 3) {
    debug_print_backtrace();
    return true;
  } else {
    return recursable( ++$depth );
  }
}
于 2015-01-28T13:51:50.690 に答える
0

Java では、コール スタックを調べることができます。PHPでも同じことができると思います:

debug-backtraceが探しているものかもしれません。

PHP は末尾呼び出しによる再帰を最適化しないため、これにより再帰の深さがわかるはずです。

于 2013-11-12T12:26:30.110 に答える
-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
    }
}
于 2013-11-12T10:02:20.377 に答える