Генератор форм

Для веб-мастера

Реклама


Построение иерархического дерева. Рекурсивная функция.

Рейтинг:
Дата: 4 июля 2010 Просмотры 27829 Комментарии 12

В сегодняшней статье я расскажу Вам, как при помощи php и mysql, можно создавать иерархические деревья, так как очень часто при разработке веб-приложения сталкиваешься с этой необходимостью! Ну например, иерархические деревья используются при выводе категорий товаров в любом интернет-магазине или же при выводе комментариев к какому-либо материалу! В общем везде, где вложенность может быть не ограниченной!

Очень важный момент при построении дерева – это структура базы данных! В качестве примера, рассмотрим структуры базы данных, для хранения категорий товаров. Самая простая таблица в базе данных, должна содержать минимум 3 поля:

  1. id - первичный ключ таблицы:
  2. parent_id - id родительского раздела
  3. name – название раздела

Чтобы создать такую таблицу необходимо выполнить следующий SQL-запрос:

  CREATE  TABLE `categories` (
`id` INT NOT NULL AUTO_INCREMENT ,
`parent_id` INT NOT NULL ,
`name` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `id` )
);

Вот как должна выглядеть наполненная таблица:

построение иерархического дерева

Итак, с базой данных разобрались! Теперь переходим к формированию самого дерева.

И вот тут, начинающие программисты, очень часто допускают одну очень серьезную ошибку! Они в цикле, делают запросы к базе данных и тем самым очень сильно нагружают сервер! Это хорошо, если в базе хранится три раздела, а представьте себе базу какого-нибудь нормального интернет магазина, в котором существует 10 разделов и в каждом разделе еще по 10 подразделов, а те в свою очередь имеют свои подразделы! И вот теперь посчитайте, сколько необходимо сделать запросов к базе, для того чтобы сформировать такое дерево?!! Такой подход не допустим! Запомните это раз и на всегда!!!

Я же покажу Вам, как в два этапа, используя один запрос к базе данных, построить дерево с любой вложенностью!

На первом этапе, мы сделаем всего один запрос к базе данных и подготовим данные в удобный для нас вид!

  //Делаем выборку из базы данных 
$result=mysql_query("SELECT * FROM categories");
//Если в базе есть записи идем дальше
if  (mysql_num_rows($result) > 0){
$cats = array();
//В цикле формируем массив категорий в качестве // ключа которого выступает id родительского раздела
while($cat = mysql_fetch_assoc($result)) $cats[$cat['parent_id']][] = $cat;
}

Как видно из примера, мы выбрали все записи из таблицы categories и если существует хотя бы одна запись, то формируем ассоциативный массив $cats, в качестве ключей которого выступает id родительского раздела.

Итак, данные для формирования дерева готовы. Теперь займемся построением самого дерева. Для этого мы будем использовать рекурсивную функцию.

Наше иерархическое дерево будет иметь следующую структуру:

<ul>

<li>Раздел 1
<ul>
<li>Раздел 1.1
<ul>
<li>Раздел 1.1.1</li>
</ul>
</li>
<li>Раздел 1.2</li>
</ul>
</li>

<li>Раздел 2 <ul>
<li>Раздел 1.1</li>
<li>Раздел 1.2</li>
</ul>
</li>

<li>Раздел 3
<ul>
<li>Раздел 3.1</li>
</ul>
</li>

</ul>

Давайте создадим рекурсивную функцию build_tree(), которая и будет заниматься построением иерархического дерева любой вложенности.

function  build_tree($cats,$parent_id){
if(is_array($cats) and count($cats[$parent_id])>0){
$tree = '<ul>';
foreach($cats[$parent_id] as $cat){
$tree .= '<li>'.$cat['name'];
$tree .= build_tree($cats,$cat['id']);
$tree .= '</li>';        
}
$tree .= '</ul>';
} else return null;         
return $tree;        }

В качестве параметров эта функция принимает два значения – массив категорий и id родителя. Если нам передан массив, в котором родитель содержит категории, то проходим по этим категориям в цикле и формируем структуру дерева. Иначе возвращаем пустой результат.  Далее функция вызывает сама себя и в качестве параметров, передает все тот же массив категорий и id самой категории! Таким образом, при следующем вызове функции build_tree(), мы формируем структуру подкатегории и так до бесконечности!

Вот так просто, всего в два этапа, можно создать иерархическое дерево, любой вложенности!

Удачи!

Оцените эту статью:
Похожие статьи
Интересно почитать

    Получать новые материалы этого сайта на свой email адрес?

    Отправлять мне комментарии по эл. почте?

Реклама

Топ комментаторы

  • Иван (1)

Нашли ошибку в тексте

Система Orphus
https://biznesguide.ru/coding/108.html
4,16 из 5 на основе 22 оценок.
Твиттер Facebook Google plus RSS