PHP从函数调用函数

时间:2018-12-18 20:04:03

标签: php function for-loop

任何人都可以向我解释该功能的实际作用吗?

function f($b=0)
{
    echo $b.',';
    /*otuput is 0,1,2,3,4,5,3,4,2,3,4,5,3,*/

    if ($b<3)
    {
        /*echo $b.',';
        when echo is here, otuput is 0,1,2,2,*/

        for ($a=0;$a<3;$a++)
        {
            /*echo $b.',';
            when echo is here, otuput is 0,1,2,3,4,2,3,1,2,3,4,2,*/

            f(++$b);
        }
    }
}

f();

为什么输出的不是0,1,2,0,1,2,0,1,2,? 以及如何从函数调用相同的函数呢?

2 个答案:

答案 0 :(得分:0)

首先它调用f(0),因此显示0

然后分别调用f(1)f(2)f(3)

f(1):显示1并运行f(2)f(3)f(4)

f(2):显示2并运行f(3)f(4)f(5)

f(3):仅显示3

f(4):仅显示4

f(5):仅显示5

...

所以:

f(0):
    {
    0,
    f(1): 
        {
        1, 
        f(2): 
            {
            2, 
            f(3): 
                {
                3
                }, 
            f(4): 
                {
                4
                }, 
            f(5): 
                {
                5
                } 
            },
        f(3):
            {
            3
            },
        f(4):
            {
            4
            }
        },
    f(2):
        {
        2, 
        f(3): 
            {
            3
            }, 
        f(4): 
            {
            4
            }, 
        f(5): 
            {
            5
            } 
        },
    f(3):
        {
        3
        }
    }

因此输出为:0,1,2,3,4,5,3,4,2,3,4,5,3,

答案 1 :(得分:0)

这是递归的效果。变量b始终在函数的本地范围内。首次启动该函数时,b的值为0,因此达到for。 ++b语法意味着b在被求值之前先增加,因此当用f(++b)达到b == 0时,它将变为f(1)。然后,函数以b == 1开始循环,并到达for。此时,与您的预期相反,当您开始新的递归循环时,您将第一个仍等待递归完成。对于下一次使用b==2进行的递归,也会发生这种情况。因此,使用一些缩进来阐明周期:

// Prints 0
for ($a = 0; $a < 3; $a++)
   f(++$b)  // $b == 0, $a == 0
      // Prints 1
      for ($a = 0; $a < 3; $a++)
         f(++$b)  // $b == 1, $a == 0
            // Prints 2
            for ($a = 0; $a < 3; $a++)
               f(++$b)  // $b == 2, $a == 0
                 // Prints 3, no further cycles
               f(++$b)  // $b == 3, $a == 1
                 // Prints 4, no further cycles
               f(++$b)  // $b == 4, $a == 2
                 // Prints 5, no further cycles
            // The function returns having completed the cycle
         f(++$b)  // $b == 2, $a == 1
            // Prints 3, no further cycles
         f(++$b)  // $b == 3, $a == 2
            // Prints 4, no further cycles
      // The function returns having completed the cycle
   f(++$b)  // $b == 1, $a == 1
      // Etc. etc.