Иерархическое дерево на php

Опубликовано 2011.08.07

Достаточно часто есть необходимость рекурсивно обойти таблицу данных и построить рекурсивное(или иерархическое) дерево на php. Рассмотрим простейший пример вызова рекурсивной функции и построения иерархического дерева. Создаем таблицу и дампим данные
  1. CREATE TABLE IF NOT EXISTS `tree` (
  2. `id` int(100) NOT NULL AUTO_INCREMENT,
  3. `parent_id` int(100) NOT NULL,
  4. `title` varchar(100) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=UTF-8 AUTO_INCREMENT=11 ;
  7.  
  8. --
  9. -- Дамп данных таблицы `tree`
  10. --
  11.  
  12. INSERT INTO `tree` (`id`, `parent_id`, `title`) VALUES
  13. (1, 0, 'первый'),
  14. (2, 0, 'второй'),
  15. (3, 0, 'третий'),
  16. (4, 2, 'во втором'),
  17. (5, 2, 'во втором1'),
  18. (6, 2, 'во втором2'),
  19. (7, 2, 'во втором3'),
  20. (8, 3, 'подпункт'),
  21. (9, 6, 'подпункт2'),
  22. (10, 6, 'подпункт3');
Делаем один единственный запрос.
  1. $result=mysql_query("SELECT id, parent_id, title FROM tree");
  2. $cats = array();
  3. while($cat = mysql_fetch_assoc($result))
  4. $cats[$cat['parent_id']][] = $cat;
  5.  
  6. function build_tree($cats,$parent_id){
  7. if(is_array($cats) and count($cats[$parent_id])>0){
  8. $tree = '<ul>';
  9. foreach($cats[$parent_id] as $cat){
  10. $tree .= '<li>'.$cat['title'];
  11. $tree .= build_tree($cats,$cat['id']);
  12. $tree .= '</li>';
  13. }
  14. $tree .= '</ul>';
  15. }
  16. else return null;
  17. return $tree;
  18. }
  19. echo build_tree($cats,0); // :)))