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 :: Определить всех потомков для данного корня

 PHP.SU

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


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

> Описание: Древовидные структуры в PHP, работа с деревом, узлами и потомками
pioneer
Отправлено: 13 Января, 2016 - 20:47:51
Post Id


Новичок


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


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




Доброго времени суток, уважаемые форумчане!
Столкнулся со следующей задачей: есть таблица категорий со следующей вполне стандартной и известной структурой: |id|parent_id|name|...| . Когда-то еще давно нашел где-то в сети очень хорошую функцию по формированию дерева категорий с любым уровнем вложенности:
PHP:
скопировать код в буфер обмена
  1.  
  2. public function mapTree($dataset)
  3. {
  4.     $tree = [];
  5.  
  6.     foreach ($dataset as $id=>&$node) {
  7.         if (!$node['parent_id']) {
  8.             $tree[$id] = &$node;
  9.         } else {
  10.             $dataset[$node['parent_id']]['childs'][$id] = &$node;
  11.         }
  12.     }
  13.  
  14.     return $tree;
  15. }
  16.  

К своему сожалению и стыду я до сих пор не особо силен в теме деревьев, поэтому работая над задачей по формированию "особого" дерева категорий снова столкнулся с трудностями Огорчение Задача заключается вот в чем: нужно сформировать из БД структурированное дерево таким образом:
Категория 1 (корень)
- Название категории 1
- Одномерный массив всех потомков категории 1 с учетом всех вложенностей
Категория 2 (корень)
- Название категории 2
- Одномерный массив всех потомков категории 2 с учетом всех вложенностей
... и так далее
Сложность заключается в том, что в базе данных, скажем, у "Категории 1" (являющейся корнем с parent_id=0) может быть сколь угодно потомков, а у этих потомков в свою очередь - свои потомки, и т.д. - короче говоря, древовидная структура с неизвестным уровнем вложенности. Таким образом, нужно чтобы в результате на выходе был массив приведенной выше структуры.

Вопрос: можно ли как-то модифицировать приведенную мною функцию, или как вообще это реализовать?
Буду очень признателен вам за помощь!

P.S: очень хотелось бы для себя разобраться с этой темой на каких-то простых примерах, чтобы наверняка "дошло", а также если вам не составит труда - не могли бы вы рассказать на примере как наоборот можно получить список всех предков для текущей категории (очень может пригодится для таких же новичков как я - например, при формировании хлебных крошек на сайте).
 
 Top
re_nat
Отправлено: 14 Января, 2016 - 19:53:43
Post Id



Частый гость


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


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




Вам нужно рекурсивно разбирать список строк из бд.

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $dbRows = [
  3.         ['id' => 1, 'parentId' => 0, 'name' => 'node1'],
  4.         ['id' => 2, 'parentId' => 0, 'name' => 'node2'],
  5.         ['id' => 3, 'parentId' => 2, 'name' => 'node3'],
  6.         ['id' => 4, 'parentId' => 2, 'name' => 'node4'],
  7.         ['id' => 5, 'parentId' => 3, 'name' => 'node5'],
  8.         ['id' => 6, 'parentId' => 3, 'name' => 'node6'],
  9.         ['id' => 7, 'parentId' => 3, 'name' => 'node7'],
  10.         ['id' => 8, 'parentId' => 7, 'name' => 'node8'],
  11. ];
  12.  
  13. function getChildNodes($dbRows, $id = 0)
  14. {
  15.         $result = [];
  16.        
  17.         foreach ($dbRows as $dbRow) {
  18.                 if ($dbRow['parentId'] == $id) {
  19.                         $result[] = [
  20.                                 'name'       => $dbRow['name'],
  21.                                 'childNodes' => getChildNodes($dbRows, $dbRow['id'])   
  22.                         ];
  23.                 }
  24.         }
  25.        
  26.         return $result;
  27. }


PHP:
скопировать код в буфер обмена
  1. var_dump(getChildNodes($dbRows));
  2. // На выходе имеем массив вида:
  3. array(2) {
  4.   [0]=>
  5.   array(2) {
  6.     ["name"]=>
  7.     string(5) "node1"
  8.     ["childNodes"]=>
  9.     array(0) {
  10.     }
  11.   }
  12.   [1]=>
  13.   array(2) {
  14.     ["name"]=>
  15.     string(5) "node2"
  16.     ["childNodes"]=>
  17.     array(2) {
  18.       [0]=>
  19.       array(2) {
  20.         ["name"]=>
  21.         string(5) "node3"
  22.         ["childNodes"]=>
  23.         array(3) {
  24.           [0]=>
  25.           array(2) {
  26.             ["name"]=>
  27.             string(5) "node5"
  28.             ["childNodes"]=>
  29.             array(0) {
  30.             }
  31.           }
  32.           [1]=>
  33.           array(2) {
  34.             ["name"]=>
  35.             string(5) "node6"
  36.             ["childNodes"]=>
  37.             array(0) {
  38.             }
  39.           }
  40.           [2]=>
  41.           array(2) {
  42.             ["name"]=>
  43.             string(5) "node7"
  44.             ["childNodes"]=>
  45.             array(1) {
  46.               [0]=>
  47.               array(2) {
  48.                 ["name"]=>
  49.                 string(5) "node8"
  50.                 ["childNodes"]=>
  51.                 array(0) {
  52.                 }
  53.               }
  54.             }
  55.           }
  56.         }
  57.       }
  58.       [1]=>
  59.       array(2) {
  60.         ["name"]=>
  61.         string(5) "node4"
  62.         ["childNodes"]=>
  63.         array(0) {
  64.         }
  65.       }
  66.     }
  67.   }
  68. }
  69.  
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB