Новичку инфо-бизнеса. От простого к сложному
 
Новичку инфо-бизнеса. От простого к сложному
Меню
Генератор форм

NEW!!! Теперь нет необходимости изучать html, javascript или php, для того, чтобы создать форму обратной связи на сайт, AJAX-форму, опрос, голосование или анкету!

Мастер создания форм

Мастер создания форм 3.0

Все нужные параметры скрипт подготовит сам - вам остается только создать проект, добавить нужные компоненты и поместить сгенерированный html-код на любую страницу Вашего сайта.

Узнать подробности >>>

Категории

.: Полезные сервисы (6)

.: HTML и CSS (6)

.: Веб-программирование (30)

.: Почтовые рассылки (7)

.: Копирайтинг (1)

.: Продвижение сайтов (10)

.: Разное (13)

.: Заработок в Интернете (10)

.: Платежные системы (5)

Популярные заметки

:: Интеркасса – новая система приема платежей на Вашем сайте

:: Форма обратной связи. Как ее создать и для чего она нужна?!

:: Выпадающие меню на HTML и CSS

:: Улучшаем обработчик формы обратной связи

:: Этапы создания собственной почтовой рассылки

Случайные заметки

:: А вы как храните логины и пароли?!

:: 11 эффективных способов поднять PR

:: Создание AJAX-голосовалки для статей. Конец

:: Оформление гиперссылок

:: Вывод случайного блока с рекламной информацией! Часть №2

Опрос

Какая тема Вам наиболее интересна: *







Результаты
Реклама

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

В сегодняшней статье я расскажу Вам, как при помощи 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(), мы формируем структуру подкатегории и так до бесконечности!

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

Удачи!

Добавить в социальные закладки Сабмит в закладки

Опубликована: 2010-07-04   Просмотров: 486   Комментариев: 2   Рейтинг: 4.5/5
 

Оцените эту статью:

Ужасно
Плохо
Так себе
Хорошо
Отлично

Коментарии:

  • Комментарий добавил(а): MaliciousMice
    Дата: 2010-08-11 16:31:49

    Функция дерево показывает отлично, но только что делать с варнингами, которые возникают при обращении к несуществующим элементам массива - отключить предупреждения не предлагать

  • Комментарий добавил(а): MaliciousMice
    Дата: 2010-08-11 16:48:40

    Кажется нашол решение.
    Нужно
    if(is_array($cats) and count($cats[$parent_id])>0)
    заменить на
    if(is_array($cats) and isset($cats[$parent_id]))
    тогда варнингов нет, т.к. к несуществующему элементу массива функция больше не обращается!!!

Добавить комментарий:

Введите Ваше имя: * Введите Ваш email: * URL Вашего сайта:
Введите Ваш комментарий: *
Введите числа с картинки
Обновить капчу


Опубликована: 2010-07-04   Просмотров: 486   Комментариев: 2   Рейтинг: 4.5/5
Подписка на рассылку
Все секреты бизнеса в Интернете у тебя на ладони
Ваше имя: *
Ваш e-mail: *

Подписка на RSS

Поиск


Комплект Реселлера

NEW!!! У тебя есть сайт, но ты не знаешь, что на нем продавать?

"Комплект Реселлера"

Самый большой сборник информационных товаров с правом перепродажи

Кликните Сюда Прямо Сейчас, Чтобы Узнать Все Подробности!

HTML-код для чайников
Хочешь изучить HTML за неделю?! Подписывайся на бесплатную рассылку "HTML-код для чайников"! Изучить HTML легко! Главное начать!

HTML-код для чайников

Ваше имя: *
Ваш e-mail: *
Моя ссылка

Если вам понравился мой сайт, я буду вам признателен, если вы разместите мою текстовую ссылку на своем сайте.
Заранее спасибо!

Код ссылки:

Рекомендую

Массовые продажи инфо-товаров!

Хотите делать массовые продажи своих инфо-продуктов на стабильной основе?

8-часовой обучающий видеокурс записанный на 4 DVD-диска, содержащий в себе набор специальных тактик, стратегий и уникальных трюков, применение которых позволит вам продавать свой информационный товар в массовом количестве!

Узнайте о всех тонкостях массового релиза и заработка по настоящему серьезных денег!!!

Узнать подробности >>>

Статистика

Заметок в базе: 88
Книг в базе: 29
Комментариев в базе: 218

Copyright © 2008-2010 Шамшур Иван. Все права защищены.
Разрешается републикация материалов сайта с обязательным указанием ссылки на
автора материала (указание автора, его сайта) и ссылки cледующего содержания:
"http://biznesguide.ru. Новичку Инфо-Бизнеса. От простого к сложному."