2014-01-14 4 views
1

Я пытаюсь получить рекурсивную функцию, работающую на PHP, но она терпит неудачу с «Неустранимая ошибка: допустимый размер памяти 134217728 байт исчерпан».PHP рекурсивная функция с массивом в параметре

Почему это не работает?

$atest = array(); 
    $atest = $this->resolveCategories(3,$atest); 
    var_dump($atest); 

И рекурсивная функция:

private function resolveCategories($iCategoryId,$aCategories){ 
    $oCategory = CategoryQuery::create()->findOneById($iCategoryId); 
    if ($oCategory->getParentId() != null){ 
     array_push($aCategories,$oCategory->getName()); 
     $this->resolveCategories($iCategoryId,$aCategories); 
    } 
    return $aCategories; 
} 
+0

Вы спрашиваете о том, как поднять лимит памяти? или как улучшить алгоритм? – Sekai

+0

:) Нет, я думаю, что алгоритм должен быстро определяться, потому что у меня есть только несколько записей в моей базе данных. Так что я думаю, что я получил ошибку кодирования где-то, чего я не нашел. –

+0

Кажется, вы каким-то образом вызвали бесконечную рекурсию. Трудно отладить это, не видя фактические данные. У вас есть возможность отладки? Можете ли вы определить, где значения отличаются от ожидаемых? –

ответ

2

Я думаю, что вы имели в виду, чтобы позвонить

$this->resolveCategories($oCategory->getParentId(), $aCategories); 

внутри, а не

$this->resolveCategories($iCategoryId, $aCategories); 
+0

thx глупая неосторожная ошибка :) Большое спасибо –

+1

Кроме того, вся польская нотация вещь немного устарела. Попробуйте смысл. '$ category' и' $ categoryNames' читаются намного лучше. –

0

Для рекурсивных функций, вам всегда нужно заявление перерыва, который обычно представляет собой IF заявление, которое будет возвращать ложь в на итерации. Общие сведения Вы можете использовать переменную $ depth и определить, насколько глубока ваша рекурсивная функция!

+0

Я попробовал else-part в моем if if. Точка прерывания должна быть, если фактический элемент не имеет parentId –

+0

getParentId() должен возвращать объект правильно? Если это так, используйте функцию is_object и не сравнивайте с Null – Sekai

0

В общем, я не понимаю, как должен работать ваш алгоритм. Кажется, что ваш массив будет рекурсивно расти по размеру, поскольку вы продолжаете передавать исходный массив (плюс элемент, нажатый на него, на рекурсивный вызов.

+0

. Алгоритм должен добавить все имена категорий в массив. он должен заканчиваться, если в фактическом элементе больше нет родителей (parentId == null). Затем он должен вернуть сгенерированный массив. –

1

Как ваша функция знает, когда остановиться? Вы просто вызываете то же самое функция с теми же параметрами, снова и снова. вы создали бесконечный цикл.

private function resolveCategories($iCategoryId,$aCategories){ 
    // code... 
    $this->resolveCategories($iCategoryId,$aCategories); 
    // code... 
} 

вы никогда не изменяя параметр $iCategoryId, так что вы просто продолжаете получать ту же строку (что случается иметь родителя) снова и снова и

Возможно, вы хотели:

$this->resolveCategories($iCategoryId-1, $aCategories); 

или что-то еще?

Смежные вопросы