переменные в функции живут до окончания ее исполнения, то есть все переменные каждой функции родителя будут живы до тех пор, пока вы не закончите исполнение самой глубокой функции и не начнете подыматься наверх и дропать все данные. Я бы , если конечно очень требуется рекурсия, делал следующее, код будет немного абстрактный.
function func($array) {
if ($какое_то_условие для выхода) {
//какой нибудь код
} else {
создаем объекты, проводим манипуляции, типо
$aaa = new SuperPuperClass();
$bbb=$aaa->getBigData;
далее грохаем $aaa , $bbb пушим в наш массив данных и тоже грохаем, далее передаем массив дальше в функцию
func(array); // запускаем функцию опять
}
}
Однако, надо понимать, что в памяти будет висеть такое зло функция ([1]) -> функция ([1,2]) .... -> функция([1,2....,N])
Чуть облегчить себе жизнь можно вынеся массив на уровень объявления функции, пусть он будет для нее глобальным. Тогда пушить или попать из него будет можно откуда угодно и он не будет дублироваться. А вообще, если есть возможность отработать через фор, лучше не делать рекурсию.