Php Рекурсивный ввод категорий в MongoDB

Я хочу ввести следующую структуру данных (игнорируя category_id, parent_id, position и level) в mongo Db в соответствии со своим методом структурных древовидных структур с дочерними ссылками: http://docs.mongodb.org/manual/tutorial/model-tree -структурах /

object(Node)#1 (6) { ["category_id"]=> int(1) ["parent_id"]=> int(0) ["name"]=> string(4) "Root" ["position"]=> int(0) ["level"]=> int(0) ["children"]=> array(2) { [0]=> object(Node)#2 (6) { ["category_id"]=> int(2) ["parent_id"]=> int(1) ["name"]=> string(15) "Root MySite.com" ["position"]=> int(0) ["level"]=> int(1) ["children"]=> array(1) { [0]=> object(Node)#3 (6) { ["category_id"]=> int(15) ["parent_id"]=> int(2) ["name"]=> string(7) "Widgets" ["position"]=> int(68) ["level"]=> int(2) ["children"]=> array(2) { [0]=> object(Node)#4 (6) { ["category_id"]=> int(24) ["parent_id"]=> int(15) ["name"]=> string(11) "Blue Widget" ["position"]=> int(68) ["level"]=> int(3) ["children"]=> array(0) { } } [1]=> object(Node)#5 (6) { ["category_id"]=> int(25) ["parent_id"]=> int(15) ["name"]=> string(13) "Purple Widget" ["position"]=> int(68) ["level"]=> int(3) ["children"]=> array(0) { } } } } } } [1]=> object(Node)#6 (6) { ["category_id"]=> int(100) ["parent_id"]=> int(1) ["name"]=> string(10) "FooBar.com" ["position"]=> int(0) ["level"]=> int(1) ["children"]=> array(1) { [0]=> object(Node)#7 (6) { ["category_id"]=> int(150) ["parent_id"]=> int(100) ["name"]=> string(6) "Gizmos" ["position"]=> int(68) ["level"]=> int(2) ["children"]=> array(2) { [0]=> object(Node)#8 (6) { ["category_id"]=> int(240) ["parent_id"]=> int(150) ["name"]=> string(11) "Blue Gizmos" ["position"]=> int(68) ["level"]=> int(3) ["children"]=> array(0) { } } [1]=> object(Node)#9 (6) { ["category_id"]=> int(250) ["parent_id"]=> int(150) ["name"]=> string(13) "Purple Gizmos" ["position"]=> int(68) ["level"]=> int(3) ["children"]=> array(0) { } } } } } } } } 

Я не могу придумать правильный PHP-код, чтобы пересечь дерево и вставить данные.

Вот что я имею до сих пор:

  public function behaviors() { return array( 'embeddedArrays' => array( 'class'=>'ext.YiiMongoDbSuite.extra.EEmbeddedArraysBehavior', 'arrayPropertyName' => 'categories', 'arrayDocClassName' => 'Category', )); } public function setCategories($user_id) { $api = new ApiCategory($user_id); $cats = $api->getCategories(); // retrieves structure above $this->recursiveCategoryTree($cats); $this->save(); // save the entire array of embedded documents if($this->getErrors()) var_dump($this->getErrors); } public function recursiveCategoryTree($tree, $i = 0) { foreach ($tree->children as $child) { if ($count($child->children ) > 0 ){ $this->categories[$i] = new Category(); $this->categories[$i]->_id = $tree->name; $i++; $this->getCategoryTree($child, $i); } else{ $this->categories[--$i]->children[] = $child->name; } } } 

Я пробовал несколько разных способов заставить его работать, но я не уверен, как счетчик должен работать в точности, или, может быть, я отстаю от базы? Используемая мной инфраструктура php (http://canni.github.com/YiiMongoDbSuite/xhtml/basic.arrays.embedded-documents.html) позволяет использовать метод категорий [index]. Согласно документации, он должен работать следующим образом:

 $data = new Data(); $data->categories[0] = new Category(); $data->categories[0]->_id = 'Root'; $data->categories[0]->children = array("Root MySite.com", "FooBar.com"); $data->categories[1]->_id = 'Root MySite.com'; $data->categories[1]->children = {immediate children}; $data->save(); 

Любая помощь в этом методе будет оценена по достоинству.

благодаря

Solutions Collecting From Web of "Php Рекурсивный ввод категорий в MongoDB"

EDIT: со всеми новыми данными я четко понимаю, чего вы пытаетесь достичь.

Поэтому я отредактировал свою старую функцию, это новая, которая должна работать в вашем коде. Дайте мне знать, поэтому я могу при необходимости настроить.

 public function setCategories($user_id) { $api = new ApiCategory($user_id); $cats = $api->getCategories(); // retrieves structure above $newCats = null; self::recursiveCatTree($newCats, $cats); $this->categories = $newCats; $this->save(); // save the entire array of embedded documents if($this->getErrors()) var_dump($this->getErrors); } public static function recursiveCatTree(&$result, $parent) { $children = $parent['children']; //we unset the children so we dont have manually set every other variable unset( $parent['children']); $result = new Category(); $result->attributes = $parent; //then loop the children, if no children it wont loop // so it will just be an empty array foreach($children as $child) { $baby = null; self::recursiveCatTree($baby, $child); $result->children[] = $baby; } }