Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Создание json структуры дерева

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
artlayers
Отправлено: 28 Мая, 2011 - 17:37:03
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Столкнулся с непосильной для меня задачей. Есть дерево с бесконечным числом уровней, ветвлений и листов, задавать можно например массивом.
Выглядит оно вот так

а ниже структура, которая его описывает
CODE (text):
скопировать код в буфер обмена
  1. [{
  2. "id":1,
  3. "content":"Root",
  4. "children": [
  5.     {
  6.         "id":2,
  7.         "content":"List2",
  8.         "children": [
  9.             {
  10.                 "id":11,
  11.                 "content":"List3"
  12.             },
  13.             {
  14.                 "id":12,
  15.                 "content":"List4",
  16.                 "children": [
  17.                     {
  18.                         "id":15,
  19.                         "content":"List5",
  20.                     },
  21.                     {
  22.                         "id":16,
  23.                         "content":"List6"
  24.                     }
  25.                 ]
  26.             },
  27.             {
  28.                 "id":12,
  29.                 "content":"List7"
  30.             }
  31.         ]
  32.     },
  33.     {
  34.         "id":3,
  35.         "content":"List9"
  36.     }
  37. ]
  38. }]


Как такую структуру можно сформировать средствами php?
Я пытался несколькими способами, один с помощью http://pear.php[dot]net/pepr/pepr-pr[dot][dot][dot]-show.php?id=198, накидал такой код
PHP:
скопировать код в буфер обмена
  1. class tree {
  2.   public $id;
  3.   public $content;
  4.   public $children;
  5.  
  6.   function tree($id,$content) {
  7.     $this->id = $id;
  8.     $this->content = $content;
  9.     $this->children = array();
  10.   }
  11. }
  12.  
  13. $tree = new tree("5", "List5");
  14. $tree->children[0] = "1";
  15. $tree->children[1] = "2";
  16. $tree->children[2] = "3";
  17. print_r($tree);
  18. require_once("JSON.php");
  19. $json = new Services_JSON();
  20. $sJSONText = $json->encode($tree);
  21. echo($sJSONText);

Все что у меня вышло получить структуру вида
CODE (text):
скопировать код в буфер обмена
  1. {"id":"5","content":"List5","children":["1&qu ot;,"2","3"]}

Но это не то, не знаю как свойства и потомков прописать. К тому же, листьев может быть в глубину сколько угодно, это все будет браться с БД, но пока для отладки можно задать массивом.

(Отредактировано автором: 28 Мая, 2011 - 17:41:41)

 
 Top
DlTA
Отправлено: 28 Мая, 2011 - 18:24:49
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




))))))
json_encode(array(...)) и на выходи получаем нужную строку
(Добавление)
чтоб не возникало не нужных мыслей:
входной параметр может быть многомерным массивом!
 
 Top
artlayers
Отправлено: 28 Мая, 2011 - 18:35:50
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




DlTA пишет:
))))))
json_encode(array(...)) и на выходи получаем нужную строку
(Добавление)
чтоб не возникало не нужных мыслей:
входной параметр может быть многомерным массивом!


Да, хорошо, функция знакома, но я не могу сформировать массив необходимой структуры, чтобы его обработать.
Явно придется дополнительно указывать какой узел кому родитель, для корня поставить null.
(Добавление)
Дерево всегда может быть разным, иметь разное количество узлов, разное количество потомков у каждого родителя. Единственное что известно о дереве: [номер узла] и [номер узла который является родителем], если это корень, то номер родителя просто null. Узлов может быть хоть 5, хоть 1000.

(Отредактировано автором: 28 Мая, 2011 - 19:11:54)

 
 Top
komprenda
Отправлено: 28 Мая, 2011 - 22:58:14
Post Id


Гость


Покинул форум
Сообщений всего: 105
Дата рег-ции: Май 2011  


Помог: 3 раз(а)




artlayers пишет:
Столкнулся с непосильной для меня задачей. Есть дерево с бесконечным числом уровней, ветвлений и листов, задавать можно например массивом.
Выглядит оно вот так

а ниже структура, которая его описывает
CODE (text):
скопировать код в буфер обмена
  1. [{
  2. "id":1,
  3. "content":"Root",
  4. "children": [
  5.     {
  6.         "id":2,
  7.         "content":"List2",
  8.         "children": [
  9.             {
  10.                 "id":11,
  11.                 "content":"List3"
  12.             },
  13.             {
  14.                 "id":12,
  15.                 "content":"List4",
  16.                 "children": [
  17.                     {
  18.                         "id":15,
  19.                         "content":"List5",
  20.                     },
  21.                     {
  22.                         "id":16,
  23.                         "content":"List6"
  24.                     }
  25.                 ]
  26.             },
  27.             {
  28.                 "id":12,
  29.                 "content":"List7"
  30.             }
  31.         ]
  32.     },
  33.     {
  34.         "id":3,
  35.         "content":"List9"
  36.     }
  37. ]
  38. }]


Как такую структуру можно сформировать средствами php?
Я пытался несколькими способами, один с помощью http://pear.php[dot]net/pepr/pepr-pr[dot][dot][dot]-show.php?id=198, накидал такой код
PHP:
скопировать код в буфер обмена
  1. class tree {
  2.   public $id;
  3.   public $content;
  4.   public $children;
  5.  
  6.   function tree($id,$content) {
  7.     $this->id = $id;
  8.     $this->content = $content;
  9.     $this->children = array();
  10.   }
  11. }
  12.  
  13. $tree = new tree("5", "List5");
  14. $tree->children[0] = "1";
  15. $tree->children[1] = "2";
  16. $tree->children[2] = "3";
  17. print_r($tree);
  18. require_once("JSON.php");
  19. $json = new Services_JSON();
  20. $sJSONText = $json->encode($tree);
  21. echo($sJSONText);

Все что у меня вышло получить структуру вида
CODE (text):
скопировать код в буфер обмена
  1. {"id":"5","content":"List5","children":["1&qu ot;,"2","3"]}

Но это не то, не знаю как свойства и потомков прописать. К тому же, листьев может быть в глубину сколько угодно, это все будет браться с БД, но пока для отладки можно задать массивом.

В php дерево можно реализовать точно так же как и в javascript с помощью массивов:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $tree = array(array("id" => 1, "content" => "Root", "childs" => array(array("id" => 2, "content" => "A", "childs" => array()), array("id" => 3, "content" => "B", "childs" => array(array("id" => 4, "content" => "BA", "childs" => array()))))));
  4.  
  5. echo "<pre>";
  6. var_dump($tree);
  7.  
  8.  
  9. ?>
  10.  

(Добавление)
CODE (htmlphp):
скопировать код в буфер обмена
  1. array(1) {
  2.   [0]=>
  3.   array(3) {
  4.     ["id"]=>
  5.     int(1)
  6.     ["content"]=>
  7.     string(4) "Root"
  8.     ["childs"]=>
  9.     array(2) {
  10.       [0]=>
  11.       array(3) {
  12.         ["id"]=>
  13.         int(2)
  14.         ["content"]=>
  15.         string(1) "A"
  16.         ["childs"]=>
  17.         array(0) {
  18.         }
  19.       }
  20.       [1]=>
  21.       array(3) {
  22.         ["id"]=>
  23.         int(3)
  24.         ["content"]=>
  25.         string(1) "B"
  26.         ["childs"]=>
  27.         array(1) {
  28.           [0]=>
  29.           array(3) {
  30.             ["id"]=>
  31.             int(4)
  32.             ["content"]=>
  33.             string(2) "BA"
  34.             ["childs"]=>
  35.             array(0) {
  36.             }
  37.           }
  38.         }
  39.       }
  40.     }
  41.   }
  42. }

(Добавление)
А это пример того как реализуется дерево

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class Node {
  3.         public $id, $data, $childs = array();
  4.  
  5.         public function __construct($id, $parent_id, $data) {
  6.                 $this->id = $id;
  7.                 $this->parent_id = $parent_id;
  8.                 $this->data = $data;
  9.         }
  10. }
  11.  
  12.  
  13. class Tree {
  14.         private $refs = array(), $tree = array();
  15.  
  16.         function __construct() {
  17.                 $node = new Node(0, NULL, "Root");
  18.                 $this->tree[] = $node;
  19.                 $this->refs[0] = &$node;
  20.         }
  21.  
  22.         function appendChild($id, $parent_id, $data) {
  23.                 if (isset($this->refs[$parent_id])) {
  24.                         if (isset($this->refs[$id])) {
  25.                                 echo "Элемент с id = $id уже имеется.<br />";
  26.                         }
  27.                         else {
  28.                                 $ref = $this->refs[$parent_id];
  29.                                 $node = new Node($id, $parent_id, $data);
  30.                                 $ref->childs[] = $node;
  31.                                 $this->refs[$id] = &$node;
  32.                         }
  33.                 }
  34.                 else {
  35.                         echo "Элемента с id = $parent_id нет.<br />";
  36.                 }
  37.         }
  38.  
  39.         function get() {
  40.                 return $this->tree;
  41.         }      
  42. }
  43.  
  44. $t = new Tree();
  45. $t->appendChild(1, 0, "Александр I");
  46. $t->appendChild(2, 1, "Александр II");
  47. $t->appendChild(3, 2, "Александр III");
  48. echo "<pre>";
  49. var_dump($t->get());
  50.  
  51. ?>
  52.  


Скачай книгу по алгоритмам и прочитай
 
 Top
artlayers
Отправлено: 29 Мая, 2011 - 11:06:56
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Спасибо! Почти так как нужно, но
1) Не могу получить json строку из этого, json_encode выводит {}
2) Если потомков нет, то children желательно не выводить.
Код немножко адаптировал под свою структуру (имена поменял в основном)
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class Node {
  3.         public $id, $content, $children = array();
  4.  
  5.         public function __construct($id, $parent_id, $content) {
  6.                 $this->id = $id;
  7.                 //$this->parent_id = $parent_id;
  8.                 $this->content = $content;
  9.         }
  10. }
  11.  
  12.  
  13. class Tree {
  14.         private $refs = array(), $tree = array();
  15.  
  16.         function __construct() {
  17.                 $node = new Node(0, NULL, "Root");
  18.                 $this->tree[] = $node;
  19.                 $this->refs[0] = &$node;
  20.         }
  21.  
  22.         function appendChild($id, $parent_id, $content) {
  23.                 if (isset($this->refs[$parent_id])) {
  24.                         if (isset($this->refs[$id])) {
  25.                                 echo "Элемент с id = $id уже имеется.<br />";
  26.                         }
  27.                         else {
  28.                                 $ref = $this->refs[$parent_id];
  29.                                 $node = new Node($id, $parent_id, $content);
  30.                                 $ref->children[] = $node;
  31.                                 $this->refs[$id] = &$node;
  32.                         }
  33.                 }
  34.                 else {
  35.                         echo "Элемента с id = $parent_id нет.<br />";
  36.                 }
  37.         }
  38.  
  39.         function get() {
  40.                 return $this->tree;
  41.         }      
  42. }
  43.  
  44. $t = new Tree();
  45. $t->appendChild(1, 0, "Data1");
  46. $t->appendChild(2, 1, "Data2");
  47. $t->appendChild(3, 2, "Data3");
  48. echo "<pre>";
  49. var_dump($t->get());
  50. //print_r(json_encode($t));
  51. ?>


Как теперь перегнать в json?
 
 Top
komprenda
Отправлено: 29 Мая, 2011 - 11:16:18
Post Id


Гость


Покинул форум
Сообщений всего: 105
Дата рег-ции: Май 2011  


Помог: 3 раз(а)




artlayers пишет:
Спасибо! Почти так как нужно, но
1) Не могу получить json строку из этого, json_encode выводит {}
2) Если потомков нет, то children желательно не выводить.
Код немножко адаптировал под свою структуру (имена поменял в основном)
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class Node {
  3.         public $id, $content, $children = array();
  4.  
  5.         public function __construct($id, $parent_id, $content) {
  6.                 $this->id = $id;
  7.                 //$this->parent_id = $parent_id;
  8.                 $this->content = $content;
  9.         }
  10. }
  11.  
  12.  
  13. class Tree {
  14.         private $refs = array(), $tree = array();
  15.  
  16.         function __construct() {
  17.                 $node = new Node(0, NULL, "Root");
  18.                 $this->tree[] = $node;
  19.                 $this->refs[0] = &$node;
  20.         }
  21.  
  22.         function appendChild($id, $parent_id, $content) {
  23.                 if (isset($this->refs[$parent_id])) {
  24.                         if (isset($this->refs[$id])) {
  25.                                 echo "Элемент с id = $id уже имеется.<br />";
  26.                         }
  27.                         else {
  28.                                 $ref = $this->refs[$parent_id];
  29.                                 $node = new Node($id, $parent_id, $content);
  30.                                 $ref->children[] = $node;
  31.                                 $this->refs[$id] = &$node;
  32.                         }
  33.                 }
  34.                 else {
  35.                         echo "Элемента с id = $parent_id нет.<br />";
  36.                 }
  37.         }
  38.  
  39.         function get() {
  40.                 return $this->tree;
  41.         }      
  42. }
  43.  
  44. $t = new Tree();
  45. $t->appendChild(1, 0, "Data1");
  46. $t->appendChild(2, 1, "Data2");
  47. $t->appendChild(3, 2, "Data3");
  48. echo "<pre>";
  49. var_dump($t->get());
  50. //print_r(json_encode($t));
  51. ?>


Как теперь перегнать в json?


print_r(json_encode($t->get()));
(Добавление)
Чтобы children не выводился ежели тот пустой измени класс ноде
PHP:
скопировать код в буфер обмена
  1. class Node {
  2.         public $id, $data;
  3.  
  4.         public function __construct($id, $data) {
  5.                 $this->id = $id;
  6.                 $this->data = $data;
  7.         }
  8. }


Tree приведи к нормальному виду, т.к. echo там не к месту(ошибки выводи через trigger error или throw new Exception, которые потом можно отлавливать)

(Отредактировано автором: 29 Мая, 2011 - 11:37:04)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB