2013-01-10 6 views
0

Bon voici mon algo récursion:difficulté à un algo récursion

public function getCategoryTree($tree,$return = array()) { 
    foreach ($tree->children as $child) { 
     if (count($child->children) > 0) 
     $return[$tree->name] = $this->getCategoryTree($child, $return); 
     else 
     $return[] = $child->name; 
    } 
    return $return; 
    } 

Voici un extrait de la structure de données que je suis en train de traverser

Object(stdClass)#290 (6) { 
     ["category_id"]=> 
     int(1) 
     ["parent_id"]=> 
     int(0) 
     ["name"]=> 
     string(4) "Root" 
     ["position"]=> 
     int(0) 
     ["level"]=> 
     int(0) 
     ["children"]=> 
     array(2) { 
     [0]=> 
     object(stdClass)#571 (7) { 
      ["category_id"]=> 
      int(2) 
      ["parent_id"]=> 
      int(1) 
      ["name"]=> 
      string(18) "Root MySite.com" 
      ["is_active"]=> 
      int(0) 
      ["position"]=> 
      int(0) 
      ["level"]=> 
      int(1) 
      ["children"]=> 
      array(11) { 
      [0]=> 
      object(stdClass)#570 (7) { 
       ["category_id"]=> 
       int(15) 
       ["parent_id"]=> 
       int(2) 
       ["name"]=> 
       string(9) "Widgets" 
       ["is_active"]=> 
       int(1) 
       ["position"]=> 
       int(68) 
       ["level"]=> 
       int(2) 
       ["children"]=> 
       array(19) { 
       [0]=> 
       object(stdClass)#566 (7) { 
        ["category_id"]=> 
        int(24) 
        ["parent_id"]=> 
        int(15) 
        ["name"]=> 
        string(16) "Blue widgets" 
        ["is_active"]=> 
        int(1) 
        ["position"]=> 
        int(68) 
        ["level"]=> 
        int(3) 
        ["children"]=> 
        array(0) { 
        } 
       } 

<snip....> 

J'essaie d'obtenir une structure de données php comme telles

categories = array("Root" => 
        array("Root MySite.com" => 
        array("Widgets" => 
         // final element is NOT an array 
         array ("Blue Widgets", "Purple Widgets" ...) 
        ) 
       ) 
      ) 

Je ne peux pas sembler tout à fait pour obtenir la structure de données je cherche l'aide de mon algo récursive. Toute aide serait géniale.

Finalement, je vais devoir l'analyser à nouveau sur le frontend et l'afficher, mais un autre problème pour un autre jour ...

+1

Quand est-il devenu "cool" d'utiliser * algo *? – Kermit

+0

au cours des 2 dernières années, lorsque le mot «épique» est devenu populaire – bonez

+0

Il n'est pas clair pour moi "Je suis en train de le stocker dans Mongo DB en tant que tel". Donc vous avez besoin d'un moyen de convertir votre objet en une chaîne ??? Les objets peuvent être enregistrés en tant que chaînes lorsqu'ils sont sérialisés. Il y a beaucoup de manières dans php de faire ceci. Les deux plus importants sont: [json-encoder] (http://php.net/manual/es/function.json-encode.php) et [sérialiser] (http://php.net/manual/es/function .serialize.php) –

Répondre

2

Jetez un oeil à cette phpFiddle pour un exemple de travail complet. La seule erreur que j'ai trouvée était le $this->getCategoryTree qui m'a donné un Erreur fataleUsing $this when not in object context. Alors êtes-vous sûr que la fonction est dans la bonne portée?

Mise à jour

J'espère que celui-ci fonctionne. :)

function traverse($root, $return = array()) { 
    $return[$root->name] = array(); 
    foreach ($root->children as $child) { 
     if (count($child->children) > 0) { 
      traverse($child, &$return[$root->name]); 
     }else { 
      array_push(&$return[$root->name], $child->name); 
     } 
    } 
    return $return; 
} 

La sortie de c'est:

Array ([Root] => 
    Array ( 
     [Root MySite.com] => 
      Array ( 
       [Widgets] => Array ([0] => Blue Widget [1] => Purple Widget) 
       [Gizmos] => Array ([0] => Blue Gizmos [1] => Purple Gizmos) 
      ) 
     [FooBar.com] => 
      Array ( 
       [Widgets] => Array ([0] => Blue Widget [1] => Purple Widget) 
       [Gizmos] => Array ([0] => Blue Gizmos [1] => Purple Gizmos) 
      ) 
    ) 
) 

Encore une fois, full working example

+0

+1 pour votre violon de travail, mais [array_push] (http://php.net/manual/ es/function.array-push.php) est exactement le même que '[]', donc la question est de nouveau à @bonez, qu'est-ce qui ne va pas? –

+0

Merci. Finalement compris ce que vous vouliez dire. Oui, la seule erreur que j'ai trouvée lors de l'utilisation de sa fonction était l'utilisation de $ this en dehors du contexte. J'ai édité ma réponse, elle correspond plus à un commentaire maintenant, mais je le laisserai être. – atomman

+0

http://phpfiddle.org/main/code/nf6-nby Le problème est que cela ne fonctionne pas pour plusieurs catégories de niveau 1, le premier ensemble sera écrasé. J'aurais mentionné cela auparavant, mais je viens de réaliser le problème. S'il vous plaît voir le phpfiddle pour un exemple. Merci les gars. – bonez