2012-02-08 4 views
3

У меня есть функция, как:PHP рекурсивный переменная не изменится

myfunction($i,$condition = false, $level = 0) { 
    do { 
     if (... some conditions here) { myfunction($i, true, ++$level) } 
     else { do something here ... } 
    while (...meet ending condition) 
} 

Я не понимаю, почему $ условие поворота true, когда я называю myfunction() рекурсивно и вернуться к false при переборе в первом уровне и $level не переключится на 0 после выхода из рекурсивного режима.

$condition = false, false, true, false, false, true, true, true ...

$level = 0,0,1,1,1,2,2,2 ... it shoul also be like = 0,0,1,0,0,1,2,2,2,0 ... и так далее ?

Спасибо

P.S: Это то же самое с массивами? Я объявил массив в наборе функций нулю, и при выходе из рекурсивного режима это не пустой больше:

myfunction($i,$condition = false, $level = 0, $array = null) { 
     do { 
    if($condition) { $array = null } <--------- I HAVE TO ADD THIS LINE TO MAKE IT NULL WHY ? 
      if (... some conditions here) {$array = Array(someblabla); myfunction($i, true, ++$level, $array) } 
      else { do something here ... } 
     while (...meet ending condition) 
    } 
+0

Спасибо всем ... $ level + 1 сделал трюк, как вы сказали. Но я не знаю, почему и где мнится в ссылках на php. – pufos

+0

http://www.php.net/manual/en/language.operators.increment.php – JJJ

+0

Может ли кто-нибудь ответить на вопрос P.S? Спасибо – pufos

ответ

2

Что вам не хватает, это разница между ++$level и $level+1. Первая изменяет значение $level, так что дальнейшие ссылки на эту переменную в том же вызове myfunction см. Приращение. Если это не то, что вы хотите, напишите $level+1.

+0

Гений ... Я этого никогда не понимал. Большое вам спасибо, ты спас свои мозги, потому что я начал расстраиваться. – pufos

+0

Рад быть полезным! –

+0

Точно так же с массивами? потому что я добавил массив к функции и когда выйдет из рекурсивного режима ... массив $ больше не равен нулю. Он был объявлен 'myfucntion ($ i, $ condition = false, $ array = null, $ level = 0)' ? Большое спасибо – pufos

2

Каждая выполнена функция имеет свои собственные локальные переменные. Как видно из названия, эти переменные локальные, не разделяемые между рекурсивными вызовами.

Оператор ++ увеличивает местную переменную.

+0

Я думаю, что pufos озадачен тем фактом, что после возвращения рекурсивного вызова '$ level' по-прежнему имеет повышенное значение, а не тот факт, что отдельные вызовы' myfunction' видят разные вещи. Но вопрос не совсем ясен, поэтому я, возможно, неправильно понял. –

+0

@ Давай, ты прав. Вы поняли это ясно. – pufos

+0

(Примечание: в тот момент, когда я написал вышеприведенный комментарий, ответ yi_H не упомянул о том, что «оператор ++ увеличивает локальную переменную».) –

2

Это происходит потому, что вы делаете ++$level, который увеличивает локальную копию $level, а затем передает новое добавочное значение в рекурсивный вызов функции.

изменить его на $level + 1 Try, который просто передает значение $value плюс один к функции, но не изменяет локальную копию переменной, так что если функция возвращает вас все еще есть старый ип приращением значения в $value.

+0

Большое спасибо, что сделал трюк. Но вы можете объяснить почему? – pufos

+0

Хорошо, теперь я понял это сейчас. Вы правы и имеете смысл. – pufos