Как получить текущий уровень рекурсии в функции 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()
, но это не похоже на простое или быстрое решение.
Я не нашел эту информацию, может быть, ее просто не существует …
Если вы просто хотите избежать попадания рекурсивного уровня на 100 уровней PHP,
count(debug_backtrace());
должно быть достаточно. В противном случае у вас нет выбора, чтобы передать аргумент глубины, хотя оператор precrement делает его несколько более чистым, как показано в примере ниже.
function recursable ( $depth = 0 ) { if ($depth > 3) { debug_print_backtrace(); return true; } else { return recursable( ++$depth ); } }
Вы должны считать это самостоятельно, единственной альтернативой может быть что-то вроде 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; } } } ?>
Это позволяет рассчитывать без второго общедоступного параметра.
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 } }
В java вы можете проверить стек вызовов. Я думаю, вы можете сделать то же самое в php:
debug-backtrace Это тот, который вы ищете?
Поскольку php не оптимизирует рекурсию с хвостовыми вызовами, это должно указывать глубину рекурсии.