::: PHP.com.ua - учимся вместе. ::: ::: PHP.com.ua - учимся вместе. :::



 
   - Вакансия PHP-программист, Днепропетровск...
  - Проблема с передачей переменной в PHP ск...
  - Как хранить конфигурацию cms'ки?
  - Проблема с сортировкой массива
  - коллизии md5
  - Странный глюк функции date
  - Скроллинг в iframe


Главная
Новости
Статьи
Шпаргалки
Файлы
О проекте
Форум
Футболки


FREEhost.com.ua - купил хостинг 10 у.е. на Begun в подарок.

iName.com.ua - регистрация доменных имен и хороший хостинг.

Библиотека программиста - нужный вам исходник или документация по необходимому для вас языку программирования.

Designclub - Клуб дизайнеров Украины.

Регистрация доменов
Хостинг

 HowtoForge.ORG.UA - Это первый Украинский ресурс развития open source программного обеспечения


Путь: Статьи > Готовые решения

Готовые решения

Автор: - Yurik
Дата публикации - 21.5.2005
Просмотров: - 3849

Простий приклад побудови дерева рубрик/статей


[nb]Наведено приклад скриптів, які візуалізують деревовидну структуру даних[/nb]

[p]Дерево рубрик (каталогів)[/p]
Постановка задачі

Розглянемо наступне представлення даних:
[code]
категорія1 (вузол1)
|
|- підкатегорія1.1 (вузол1.1)
|- підкатегорія1.2 (вузол1.2)
| |- підкатегорія1.2.1 (вузол1.2.1)
| |- підкатегорія1.2.2 (вузол1.2.2)
|- підкатегорія1.3 (вузол1.3)
|- підкатегорія1.3.1 (вузол1.3.1)
| |- підкатегорія1.3.1.1 (вузол1.3.1.1)
|
.................

[/code]
Подібну структуру має, наприклад, файлова система комп"ютера. Ну, або бібліотечний каталог. Така штука називається ієрархічною або деревовидною структурою даних. Дерево складається з вузлів та гілок. Вузлом будемо вважати кожен об"єкт даних - категорія1, підкатегорія1, підкатегорія2 і тд. При цьому категорія1 є предком підкатегорії1. Гілкою будемо називати сукупність усіх вузлів, пов"язаних між собою зв"язками нащадок - предок. (наприклад, категорія1 - підкатегорія1.2 - підкатегорія1.2.1). Розглянемо тепер способи "боротьби" з подібними структурами. В даній статті не будемо залізати дуже глибоко в теорію, розглянемо два випадки, ієрархічна структура з визначенним рівнем вкладень категорій (тобто, чітко визначено, що кожна категорія найвищого рівня містить строго визначену кількість вкладених підкатегорій) та структури, в яких ступінь вкладеності не є детермінованим, тобто кожне відгалуження може містити будь-яку кількість вузлів.

Отже, будемо вважати, що наші дані зберігаються в базі MySQL, при чому структура даних наступна:
[code]

id reference cat_title
0 0 Category1
1 0 Category2
2 1 SubCategory
................................

Ідея наступна - якщо ми маємо категорію найвищого рівня, то її reference=0, якщо ж ми маємо підкатегорію, то її reference = id категорії предка (тобто, в reference міститься фактично id батьківської категорії (предка або категорії, якій належить дана підкатегорія)
[/code]


Підхід до реалізації

Розглянемо спочатку рекурсивний алгоритм. До очевидних переваг рекурсії можна віднести відносну простоту та компактність результуючого алгоритму, а також можливість роботи рекурсивних функцій з деревами будь-якої ступені вкладеності. До очевидних недоліків такого підходу можна віднести можливість вичерпання ресурсів комп"ютера при наявності великої кількості вкладених категорій. Колись, коли я ще бавився програмуванням на асемблері та турбо паскалі, необхідно було вживати додаткових заходів для уникнення проблеми переповнення стеку при рекурсії. Але це так, ліричний відступ.

В даній статті я наведу приклади побудови (розбору) дерев за допомогою рекурсивного та нерекурсивного алгоритму.
[nb]
Наведені нижче скрипти слід розглядати як приклади побудови алгоритму рішення задачі. Я не ставив за мету написання оптимального з точки зору продуктивності та швидкодії коду. Можливо, якщо я матиму час і натхнення, я і доведу скрипти до нормального стану. З часом...
[/nb]
Алгоритм з використанням рекурсії


Ну що ж, не будемо розтягувати задоволення:
[code]
<?
// Функція, яка, власне, і друкує нам назву категорії та перевіряє, чи має ця категорія підкатегорії чи сатті. Якщо має, то друкує їх назви і перевіряє, чи має знайдена підкатегорія ще підпідкатегорії чи статті. Якщо має ............
function explode_node(&$data, &$faq, $node, $str){
$i=0;
reset($data);
$str .= "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
while (list($index, $data_node) = each($data)){
if ($data_node['ref']==$node){
echo $str.$data_node['title']."<br>";
unset($data[$index]);
reset($faq);
while(list($faq_index, $faq_node) = each($faq)){
if($faq_node['ref']==$data_node['id']){
echo $str.$str."<FONT COLOR=red>".$faq_node['title']."</FONT><br>";
unset($faq[$faq_index]);
}
}
explode_node($data, $faq, $data_node['id'], $str);
reset($data);
}
}
}
?>
[/code]



Обсудить в ФОРУМе - комментариев ()


Путь: Статьи > Готовые решения

Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Контакты Design by webFaction Ukrainian PHP Group 2004-2005