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
Форумы портала PHP.SU :: Версия для печати :: древовидный массив
Форумы портала PHP.SU » » Вопросы новичков » древовидный массив

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

1. Иван кали - 03 Апреля, 2017 - 09:49:19 - перейти к сообщению
всем привет! у меня меню построено так: достаем записи из бд(id, title, parent), из них строим массив, и его переделываем в дерево дописывая child.
получается такое дерево
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  [5] => Array
  3.         (
  4.             [category_id] => 5
  5.             [category_name] => корневой
  6.             [parent_id] => 0
  7.             [childs] => Array
  8.                 (
  9.                     [15] => Array
  10.                         (
  11.                             [category_id] => 15
  12.                             [category_name] => категория 1
  13.                             [parent_id] => 5
  14.                         )
  15.  
  16.                     [16] => Array
  17.                         (
  18.                             [category_id] => 16
  19.                             [category_name] => категория 2
  20.                             [parent_id] => 5
  21.                             [childs] => Array
  22.                                 (
  23.                                     [18] => Array
  24.                                         (
  25.                                             [category_id] => 18
  26.                                             [category_name] => категория 2.1
  27.                                             [parent_id] => 16
  28.                                         )
  29.  
  30.                                     [19] => Array
  31.                                         (
  32.                                             [category_id] => 19
  33.                                             [category_name] => категория 2.2
  34.                                             [parent_id] => 16
  35.                                         )))
  36.  


я пытаюсь при обращении к категории получить её детей

делаю так
PHP:
скопировать код в буфер обмена
  1.  
  2. function childs($array, $category_id = 0) {
  3.    
  4. foreach ($array as $key) {
  5.         if ($key['category_id'] == $category_id) {
  6.             $data = $key['childs'];
  7.           }
  8. }
  9.     return $data;
  10. }
  11.  

и получаю список детей, но только с корневых списков, дальше надо как то рекурсию применить, но никак не получается. может кто подскажет?
уже хз сколько сижу, первая практика Огорчение
2. andrewkard - 03 Апреля, 2017 - 16:19:48 - перейти к сообщению
Не получается с рекурсией, делайте без, это же возможно.
3. Иван кали - 03 Апреля, 2017 - 16:44:09 - перейти к сообщению
andrewkard пишет:
Не получается с рекурсией, делайте без, это же возможно.


всё, сделал без неё )
решил с помощью запроса к базе
сначала достал id нужных категорий с простого массива
PHP:
скопировать код в буфер обмена
  1.  
  2. function list_category($array, $category_id){
  3.     if(!$category_id) return false;
  4.         foreach($array as $item){
  5.         if($item['parent_id'] == $category_id){
  6.         $data .= $item['category_id']  . ",";
  7.   }}
  8.     return $data;
  9. }


и потом с базы вытащил свои массивы

PHP:
скопировать код в буфер обмена
  1.  
  2. function childs($list_category = false){
  3.     if($list_category){
  4.         $query = "SELECT * FROM category WHERE category_id IN($list_category)";
  5.     }else{
  6.         $query = "SELECT * FROM category ";
  7.     }
  8.     $res = mysql_query($query) ;
  9.     $category = array();
  10.     while($row = mysql_fetch_assoc($res)){
  11.         $category] = $row;
  12.     }
  13.     return $category
  14. }


но с массивом было бы интересно разобраться )
спасибо за внимание )
4. quad - 03 Апреля, 2017 - 18:22:13 - перейти к сообщению
Иван кали пишет:
всем привет! у меня меню построено так: достаем записи из бд(id, title, parent), из них строим массив, и его переделываем в дерево дописывая child.
получается такое дерево
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  [5] => Array
  3.         (
  4.             [category_id] => 5
  5.             [category_name] => корневой
  6.             [parent_id] => 0
  7.             [childs] => Array
  8.                 (
  9.                     [15] => Array
  10.                         (
  11.                             [category_id] => 15
  12.                             [category_name] => категория 1
  13.                             [parent_id] => 5
  14.                         )
  15.  
  16.                     [16] => Array
  17.                         (
  18.                             [category_id] => 16
  19.                             [category_name] => категория 2
  20.                             [parent_id] => 5
  21.                             [childs] => Array
  22.                                 (
  23.                                     [18] => Array
  24.                                         (
  25.                                             [category_id] => 18
  26.                                             [category_name] => категория 2.1
  27.                                             [parent_id] => 16
  28.                                         )
  29.  
  30.                                     [19] => Array
  31.                                         (
  32.                                             [category_id] => 19
  33.                                             [category_name] => категория 2.2
  34.                                             [parent_id] => 16
  35.                                         )))
  36.  


я пытаюсь при обращении к категории получить её детей

делаю так
PHP:
скопировать код в буфер обмена
  1.  
  2. function childs($array, $category_id = 0) {
  3.    
  4. foreach ($array as $key) {
  5.         if ($key['category_id'] == $category_id) {
  6.             $data = $key['childs'];
  7.           }
  8. }
  9.     return $data;
  10. }
  11.  

и получаю список детей, но только с корневых списков, дальше надо как то рекурсию применить, но никак не получается. может кто подскажет?
уже хз сколько сижу, первая практика Огорчение

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. function childs($array, $category_id = 0) {
  3. $data='';
  4. foreach ($array as $key) {
  5.                         if ($key['category_id'] == $category_id) {
  6.                         $data.= $key['category_id'];
  7.                         $data.= $key['category_name'];
  8.                         $data.= $key['parent_id'];
  9.                         foreach ($key['childs'] as $key1) {
  10.                         $data.=$key1['category_id'];
  11.                         $data.=$key1['category_name'];
  12.                         $data.=$key1['parent_id'];
  13.                         if(isset($key1['childs'])) {
  14.                         foreach ($key1['childs'] as $key2) {
  15.                         $data.=$key2['category_id'];
  16.                         $data.=$key2['category_name'];
  17.                         $data.=$key2['parent_id'];
  18.                         }
  19.                         }
  20.                         }
  21.                         }
  22.                         }
  23.     return $data;
  24. }
  25.  
5. Строитель - 03 Апреля, 2017 - 18:34:57 - перейти к сообщению
Иван кали пишет:
дальше надо как то рекурсию применить, но никак не получается. может кто подскажет?
Для того, что бы вам было проще понять принцип работы рекурсивной функции, вам нужно взять массив по проще (с меньшей глубиной вложенности). Я набросал простой пример, думаю - разберётесь
Спойлер (Отобразить)
6. Иван кали - 12 Апреля, 2017 - 07:20:25 - перейти к сообщению
благодарю за ответы! )

 

Powered by ExBB FM 1.0 RC1