4

我需要知道在函数中调用了多少次递归函数。这是我的功能:

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()。

我认为可能可行的一种方法是,如果我在函数之外设置数组或计数器,但我不知道是否可以在函数之外的函数中调用变量。

关于如何在函数外部调用变量甚至是计算函数被调用次数的更好方法的任何想法?

4

8 回答 8

19

选项 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;
于 2013-06-13T08:36:46.527 回答
4

您可以向递归函数添加另一个参数,该参数将用作计数器:

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.' >';
}

或者您可以使用全局变量。

于 2013-06-13T08:34:14.253 回答
2

当我遇到这个问题时,我通常的解决方案是添加一个计数器变量作为额外参数,例如

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

这样做的好处是原始调用structure不需要您指定计数器,并且仍然可以将其称为structure($x);

于 2013-06-13T08:36:30.003 回答
0

你有很多选择。

最简单的是:

  • 你可以添加静态变量
  • 您可以将计数器作为附加变量传递。

不太明显和更复杂的解决方案可能包括使用注册表和/或单例模式。

于 2013-06-13T08:38:03.897 回答
0

将函数外的counter-Variable定义为函数GLOBAL内的增加。

于 2013-06-13T08:33:59.527 回答
0

使用static变量。如

function structure($x) {
     static $counter = 0;
    /* your code */
    $counter++;
}
于 2013-06-13T08:34:23.577 回答
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);
于 2013-06-13T08:34:44.490 回答
-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.' >';
}
于 2013-06-13T08:52:11.953 回答