Рекурсивная функция не возвращает значение в PHP - PullRequest
1 голос
/ 04 октября 2010

У меня есть рекурсивная функция, определенная следующим образом

private function _buildPathwayRecurse(&$category, &$reversePathway = array()) {
  $category->uri = FlexicontentHelperRoute::getCategoryRoute($category->id);
  $reversePathway[] = $category;

  if ($category->parent_id != 0) {
    $category = $this->_getCatForPathway($category->parent_id);
    $this->_buildPathwayRecurse($category, $reversePathway);
  } else {
    return $reversePathway;
  }
}

и я так называю

$reversePathway = $this->_buildPathwayRecurse($category);

Однако $ reversePathway оказывается нулевым. Есть идеи, почему это так? Я прошел через мой код, используя XDebug, и, насколько я могу судить, все работает как надо. Когда я доберусь до линии

return $reversePathway

$ reversePathway выглядит идеально. Он сохраняется через вызовы функций и каждый раз получает новый элемент. прямо перед выполнением обратной строки у нее есть массив из нескольких элементов, как и должно быть, но к тому времени я получаю

$reversePathway = $this->_buildPathwayRecurse($category);

кажется, просто исчезнуть!

Ответы [ 3 ]

6 голосов
/ 07 октября 2011

Вам не хватает возврата.попробуйте

private function _buildPathwayRecurse(&$category, &$reversePathway = array()) {
$category->uri = FlexicontentHelperRoute::getCategoryRoute($category->id);
$reversePathway[] = $category;

if ($category->parent_id != 0) {
$category = $this->_getCatForPathway($category->parent_id);
return $this->_buildPathwayRecurse($category, $reversePathway); //no assignment,     the     function will be executed but even if the inner part goes to the else block, there's nothing to hold the returned value.
//nothing to return when it gets here.
  } else {
    return $reversePathway;
  }
}
4 голосов
/ 04 октября 2010

Блок if () указывает, что он должен либо рекурсивно , либо возвращать значение.

Первая итерация, очевидно, будет рекурсивной, поэтому она не будет выполнять возврат, поэтому все ваширабота по созданию массива не будет возвращена из начальной итерации.

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

3 голосов
/ 04 октября 2010

В вашем if блоке отсутствует оператор возврата.

private function _buildPathwayRecurse(&$category, &$reversePathway = array()) {
  $category->uri = FlexicontentHelperRoute::getCategoryRoute($category->id);
  $reversePathway[] = $category;

  if ($category->parent_id != 0) {
    $category = $this->_getCatForPathway($category->parent_id);
    $this->_buildPathwayRecurse($category, $reversePathway); //no assignment, the function will be executed but even if the inner part goes to the else block, there's nothing to hold the returned value.
    //nothing to return when it gets here.
  } else {
    return $reversePathway;
  }
}
...