Intereting Posts
Установка переменных в Constructor VS для определения класса Какова цель блока кода, который не является частью if / function и т. Д. Несколько совпадений в группе регулярных выражений? Как изменить файл xml с помощью PHP Как использовать серверные переменные в тестах PHPUnit Test? Как изменить действие woocommerce_before_cart Метод Laravel Log useFiles делает запись в журнале несколькими файлами HTTP-запросы с файловым_компонентом, получение кода ответа Сохранение php-вывода в файле Используя .htaccess, запретите пользователям доступ к каталогам ресурсов и тем самым разрешить доступ к ресурсам исходного кода Предупреждение: mysql_real_escape_string (): доступ запрещен для пользователя '' @ 'localhost' (с использованием пароля: НЕТ) Поддержка часовых поясов пользователей Как автозагрузите Guzzle в Laravel 4? Как удалить значения из массива в PHP? Как получить последний вставленный идентификатор таблицы MySQL в PHP?

Как получить текущий уровень рекурсии в функции PHP

Как получить текущий уровень рекурсии в функции 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 не оптимизирует рекурсию с хвостовыми вызовами, это должно указывать глубину рекурсии.