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

Опубликовано 2011.08.07 в разделе Php

Достаточно часто есть необходимость рекурсивно обойти таблицу данных и построить рекурсивное(или иерархическое) дерево на 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); // :)))

13 Комментариев

Оставить комментарий

  1. Гость 2013/12/09

    Интересно а как сделать пагинацию на это дерево?

    Ответить

    1. Админ 2013/12/10

      Интересный вопрос)) Обычно деревья не бывают такими большими. Если раскидывать на страницы верхний уровень - то отдельным запросом вытаскивать термины самого первого уровня, разбивать их на страницы и у них вытаскивать подтермины.

      Ответить

  2. Гость 2013/07/28

    Подскажите, пожалуйста. Куда нужна вставить родительский элемент (вручную, не из бд), что бы он выводился лишь один раз среди таких-же родительских элементов?

    Ответить

    1. Админ 2013/07/29

      Если я правильно понял ваш вопрос, то заменить переменные $cat['id'] и $parent_id на айдишник родительского элемента.
      Или может просто условие в запросе дописать?

      Ответить

  3. Гость 2013/01/22

    Спасибо огромное за статью. Единственное место, где все понятно!!

    Ответить

  4. Гость 2012/11/27

    У меня почему то ошибку выдает
    Notice: Undefined index: 3 in /home/a/andrey6z/jsoop.ru/public_html/blocks/leftcolum.php on line 49
    вот эта строка

    1. if(is_array($cats) and count($cats[$parent]) >0 )

    Ответить

    1. Админ 2012/11/29

      Попробуй написать так:

      1. if(is_array($cats) and isset($cats[$parent_id])>0)

      Ответить

  5. Гость 2012/11/06

    Спасибо!

    Ответить

  6. Гость 2012/04/10

    Запись не моя, я просто разместил коммент.

    Ответить

  7. Гость 2012/02/21

    Так сделаем же это общими усилиями! Поддержим тему! :)

    Ответить

  8. Гость 2012/02/08

    Однозначно стоит поддержать эту запись комментариями =)

    Ответить

  9. Гость 2011/10/19

    Однозначно напишу комментарий, отличная запись.

    Ответить

  10. Гость 2011/10/10

    Скорее нужно поддержать эту запись комментариями, правда ведь?

    Ответить

Ваш комментарий успешно создан

Ваш комментарий

  • Для выделения кода оберните его в тэги <code> и </code>
  • Отметьте планету