подсчитывая количество раз, когда вызывается рекурсивная функция

Мне нужно знать, сколько раз в функции вызывается рекурсивная функция. Это моя функция:

function structure($x) { $qry = mysql_query("SELECT `parent_id` FROM `categories` WHERE `categories_id`=$x"); $result = mysql_fetch_assoc($qry); $cat = $result['parent_id']; if($cat !=0) { structure($cat); } echo $cat.' >'; } 

Я попытался добавить счетчик, например $ i = 0, затем $ i ++, но при каждом вызове функции он, конечно, вернется обратно к $ i = 0. Я попытался добавить массивы и подсчитать массивы, но, конечно, он должен установить новый массив, $ i = array (), каждый раз, когда вызывается функция.

Единственный способ, который, как я могу думать, может работать, – это установить массив или счетчик вне функции, но я не знаю, можно ли его вызвать в функции, находящейся вне функции.

Любые идеи о том, как вызывать переменную вне функции или даже лучший способ подсчета времени, вызванного функцией?

Вариант 1: передать переменную по ссылке

 function structure($cat, &$counter) { $counter++; ... } structure('foo', $counter); echo $counter; 

Вариант 2: используйте static переменную

 function structure($cat) { static $counter = 0; echo ++$counter; ... } 

Вариант 3: используйте global переменную (нет!)

 $counter = 0; function structure($cat) { global $counter; $counter++; ... } 

Вариант 4: используйте закрытие

 $counter = 0; $structure = function ($cat) use (&$counter) { $counter++; ... } $structure('foo'); echo $counter; 

Вы можете добавить еще один параметр в свою рекурсивную функцию, которая будет служить в качестве счетчика:

 function structure($x, $cnt) { $qry = mysql_query("SELECT `parent_id` FROM `categories` WHERE `categories_id`=$x"); $result = mysql_fetch_assoc($qry); $cat = $result['parent_id']; if($cat !=0) { structure($cat, $cnt++); } echo $cat.' >'; } 

или вы можете использовать глобальную переменную.

Мое обычное решение этой проблемы, когда я столкнулся с ней, заключается в добавлении переменной счетчика в качестве дополнительного параметра, например

 function structure($x, $i=0) { ... structure($nextX, ++$i); ... } 

Это имеет то преимущество, что первоначальный вызов structure не требует, чтобы вы указывали счетчик, и такую ​​можно еще назвать structure($x);

Определите counter-Variable вне функции GLOBAL и увеличивайте внутри функции.

используйте static переменные. такие как

 function structure($x) { static $counter = 0; /* your code */ $counter++; } 

Использовать ссылки:

 function structure($x, &$i) { $i++; $qry = mysql_query("SELECT `parent_id` FROM `categories` WHERE `categories_id`=$x"); $result = mysql_fetch_assoc($qry); $cat = $result['parent_id']; if($cat !=0) { structure($cat, $i); } echo $cat.' >'; } $i = 0; structure($var,$i); var_dump($i); 

У вас есть несколько вариантов.

Самые простые:

  • вы можете добавить статическую переменную
  • вы можете передать счетчик в качестве дополнительной переменной.

Менее очевидные и более сложные решения могут включать использование реестров и / или шаблонов Singleton.

попробуй это

 // function Counter $cnt = 0; function structure($x) { global $cnt; $cnt += 1; $qry = mysql_query("SELECT `parent_id` FROM `categories` WHERE `categories_id`=$x"); $result = mysql_fetch_assoc($qry); $cat = $result['parent_id']; if($cat !=0) { structure($cat); } echo $cat.' >'; }