计算调用递归函数的次数

时间:2013-06-13 08:32:01

标签: php function

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

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

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

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

8 个答案:

答案 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.' >';
}
相关问题