2012-01-24 4 views
1

Voilà ma fonction récursive:Quel est le problème avec cette fonction récursive?

function get_descendants($category_id) 
{ 
    global $descendants; 

    $categories = get_ancestors($category_id); 
echo "get_ancestors($category_id);<br>"; 

// print_r($categories);exit; 

    if (!is_array($categories)) 
     return; 

    foreach ($categories as $category) 
    { 
     $descendants[] = $category['id']; 

     // Look for other leafs 
     get_descendants($category['id']); 
    } 

    return $descendants; 
} 

function get_ancestors($parent_id) 
{ 
    global $db, $locale; 

    $result = $db->query(" 
      SELECT ... 
       AND parent_id = $parent_id 
    "); 

    $categories = $result->fetch_all(MYSQLI_ASSOC); 

    if ($result->num_rows > 0) 
    { 
     foreach ($categories as $category) 
      $data[] = $category; 

     return $data; 
    } 
} 

Le problème est qu'il fait le même appel deux fois. Donc, cela est le résultat de l'exécution du code:

get_ancestors(8); 
get_ancestors(1); 
get_ancestors(2); 
get_ancestors(4); 
get_ancestors(5); 
get_ancestors(3); 
get_ancestors(6); 
get_ancestors(8); 
get_ancestors(1); 
get_ancestors(2); 
get_ancestors(4); 
get_ancestors(5); 
get_ancestors(3); 
get_ancestors(6); 

Là où je doit seulement voir

get_ancestors(8); 
get_ancestors(1); 
get_ancestors(2); 
get_ancestors(4); 
get_ancestors(5); 
get_ancestors(3); 
get_ancestors(6); 

Qu'est-ce qui ne va pas?

Merci.

+1

Vous ne devriez probablement pas déclarer votre variable $ descendants comme globale, sinon elle ne sera jamais "effacée". –

+1

Votre méthode 'get_ancestors()' semble retourner des descendants à la place des ancêtres, votre méthode 'get_ancestors()' ne devrait-elle pas avoir un autre nom, comme 'get_childs()'? – BlackCharly

+0

C'est correct. J'ai l'intention de renommer la fonction bientôt :) – oaziz

Répondre

2

Le problème est que ne veut pas $descendants être global.

Vous partagez une variable sur tous les appels récursifs. Il doit vraiment être local pour que la logique que vous utilisez soit correcte.

Au lieu de global $descendants; faire $descendants = array();.

Questions connexes