Мне нужно знать, сколько раз в функции вызывается рекурсивная функция. Это моя функция:
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.' >'; }