Функция вызова PHP из функции

Может кто-нибудь объяснить мне, что на самом деле происходит в функции?

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,?
А как поступить с вызовом одной и той же функции из функции?

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,

0

Другие решения

Это эффект рекурсии. Переменная b всегда находится в локальной области функции. Когда вы впервые запускаете функцию, b значение равно 0, поэтому достигает для. ++b Синтаксис означает, что b увеличивается до оценки, поэтому при достижении f(++b) с b == 0становится f(1), Затем функция начинает цикл с b == 1и достигает для. В этот момент, вопреки тому, что вы ожидали, у вас есть первое, что все еще ожидает завершения рекурсии, когда вы начинаете новый цикл рекурсии. Это также происходит для следующей рекурсии, с 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.
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector