2010-10-04 7 views
1

J'ai une fonction récursive définie comme suitfonction récursive ne pas retourner une valeur en PHP

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; 
    } 
} 

et je vous appelle comme si

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

Cependant reversePathway $ finit par être nul . Une idée de pourquoi c'est? J'ai parcouru mon code en utilisant XDebug et autant que je sache, tout fonctionne comme il se doit. Quand j'arrive à la ligne

return $reversePathway 

$ reversePathway est parfait. Il persiste à travers les appels de fonction et gagne un nouvel élément à chaque fois. juste avant l'exécution de la ligne de retour il possède un tableau de quelques articles, tout comme il devrait être, mais au moment où je sors à

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

il semble juste disparaitra!

+0

Vous remplacez la variable dans la deuxième ligne de la fonction. Cela arrive à chaque récursion. – halfdan

Répondre

4

bloc if() indique qu'il soit récursion ou retourner une valeur.

La première itération se répètera évidemment, donc elle ne fera pas le retour, donc tout votre travail de construction du tableau ne sera pas retourné hors de l'itération initiale.

Vous souhaitez probablement qu'il revienne dans les deux sens plutôt que d'avoir une clause else.

3

Votre bloc if manque une déclaration de retour.

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; 
    } 
} 
6

Il vous manque une déclaration de retour. try

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; 
    } 
} 
Questions connexes