我需要知道在函数中调用递归函数的次数。这是我的功能:
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()。
我能想到的一种方法是如果我在函数外部设置数组或计数器,但我不知道是否可以在函数外部的函数中调用变量。
关于如何在函数外调用变量的任何想法,甚至是计算函数调用次数的更好方法?
答案 0 :(得分:16)
选项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;
答案 1 :(得分:3)
您可以在递归函数中添加另一个参数,该函数将用作计数器:
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.' >';
}
或者您可以使用全局变量。
答案 2 :(得分:2)
当我遇到这个问题时,我通常的解决方法是添加一个计数器变量作为额外的参数,例如
function structure($x, $i=0) {
...
structure($nextX, ++$i);
...
}
这样做的好处是,对structure
的原始调用不需要您指定计数器,仍然可以将其称为structure($x);
答案 3 :(得分:0)
将函数外部的反变量定义为GLOBAL
并在函数内部增加。
答案 4 :(得分:0)
使用static
变量。比如
function structure($x) {
static $counter = 0;
/* your code */
$counter++;
}
答案 5 :(得分:0)
使用参考:
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);
答案 6 :(得分:0)
您有多种选择。
最简单的是:
不太明显和更复杂的解决方案可能包括使用Registry和/或Singleton模式。
答案 7 :(得分:-1)
试试这个
// 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.' >';
}