2013-01-10 3 views
0

Okay вот моя рекурсия алго:Возникли проблемы с рекурсией алгоритмом

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

Вот фрагмент структуры данных Я пытаюсь пройти

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....> 

Я пытаюсь получить структура PHP данных как такой

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

Я не совсем, кажется, чтобы получить структуру данных, я ищу с помощью моего рекурсивный Algo. Любая помощь будет отличной.

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

+1

Когда он стал "круто", чтобы использовать * Algo *? – Kermit

+0

Когда-то за последние 2 года, когда стало популярным слово «эпос» – bonez

+0

Мне непонятно «Я пытаюсь сохранить его в Mongo DB как таковой». Итак, вам нужен способ конвертировать ваш объект в строку ??? объекты могут быть сохранены в виде строк при их сериализации. В php есть много способов сделать это. Двумя наиболее значимыми являются: [json-encode] (http://php.net/manual/es/function.json-encode.php) и [serialize] (http://php.net/manual/es/function .serialize.php) –

ответ

2

Посмотрите на эту phpFiddle для полного рабочего примера. Единственная ошибка, которую я нашел, это $this->getCategoryTree, которая дала мне Неустранимая ошибкаUsing $this when not in object context. Итак, вы уверены, что функция находится в правильном объеме?

Обновлено

Я надеюсь, что это работает. :)

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

Выход из этого:

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) 
      ) 
    ) 
) 

Опять full working example

+0

+1 для вашей рабочей скрипки, но [array_push] (http://php.net/manual/ es/function.array-push.php) - это то же самое, что '[]', поэтому вопрос снова связан с @bonez, что не так? –

+0

Спасибо. Наконец понял, что вы имели в виду. Да, единственная ошибка, которую я обнаружил при использовании его функции, заключалась в использовании '$ this' вне контекста. Я отредактировал свой ответ, теперь он больше похож на комментарий, но я позволю. – atomman

+0

http://phpfiddle.org/main/code/nf6-nby Проблема в том, что это не работает для нескольких категорий уровня 1, первый набор будет перезаписан. Я бы упомянул об этом раньше, но я только понял проблему. Пожалуйста, посмотрите пример phpfiddle. Спасибо, парни. – bonez

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