Путь: >
Готовые решения
Готовые решения
Автор: - 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 .= " ";
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.
|