Постановка задачи
Необходимо отрисовать в html дерево данных из базы в виде вложенных списков используя шаблонизатор
Smarty
Первое что приходит на ум, это использовать рекурсивную функцию, которая обладает удивительным качеством автомодельности по параметру, т.е. фрактальностью, а значит самоподобием. Именно самоподобие позволит построить вложенные списки. Поэтому рекурсию используют для построений фракталов Мандельброта
Для начала немного дефиниций.
Реку́рсия (англ. recurrence — повторение) — метод определения класса объектов или методов предварительным заданием одного или нескольких (обычно простых) его базовых случаев или методов, а затем заданием на их основе правила построения определяемого класса, ссылающегося прямо или косвенно на эти базовые случаи. Другими словами, рекурсия — способ общего определения объекта или действия через себя, с использованием ранее заданных частных определений. Рекурсия используется, когда можно выделить самоподобие задачи.
Рекурси́вная фу́нкция (от лат. recursio — возвращение) — это числовая функция f(n) числового аргумента, которая в своей записи содержит себя же.
Реализация
Создадим таблицу в базе
CREATE TABLE `tbl_tree` (
`idt` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) NOT NULL DEFAULT '0',
`title` varchar(200) NOT NULL,
PRIMARY KEY (`idt`),
KEY `title` (`title`),
KEY `pid` (`pid`)
);
Текст файла tree.php
<?php
include "Smarty.class.php";
$smarty = new Smarty;
$smarty->template_dir=$_SERVER["DOCUMENT_ROOT"]."/templates";
$smarty->compile_dir=$_SERVER["DOCUMENT_ROOT"]."/templates_c";
$DB_HOST = "localhost";
$DB_LOGIN = "";
$DB_PASSWORD = "";
$DB_NAME="";
$link = mysql_connect($DB_HOST, $DB_LOGIN, $DB_PASSWORD);
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db($DB_NAME);
function get_tree($p_id)
{
$res_array=array();
$res_array[]=array('ul'=>1, 'idt'=>null, 'title'=>null);
$sql='select idt, title from tbl_tree where pid='.$p_id;
$data=mysql_query($sql);
while ($tmp=mysql_fetch_array($data))
{
$res_array[]=array('ul'=>0, 'idt'=>$tmp['idt'], 'title'=>$tmp['title']);
$tmp_array=get_tree($tmp['idt']);
if (!is_null($tmp_array)) $res_array=array_merge($res_array, $tmp_array);
}
if (sizeof($res_array)>1)
{
$res_array[]=array('ul'=>2, 'idt'=>null, 'title'=>null);
}
else $res_array=null;
return $res_array;
}
$tree_array=get_tree(0);
$smarty->assign('tree_array', $tree_array);
$smarty->display('tree.tpl');
?>
Текст файла tree.tpl
{section name=t loop=$tree_array}
{if $tree_array[t].ul==1}<ul>{elseif $tree_array[t].ul==2}</ul>{else}<li>{$tree_array[t].title}</li>{/if}
{/section}
Вуаля!
Благодарность
Этот алгоритм был предложен
Андреем Брущенко, за что ему пиво и всяческие благодарности!
А на посошок мне хотелось бы привети песню барда, поэта, художника и музыканта
Владимира Завгороднего «Дерево»:
ДЕРЕВО
Я квітуче дерево
біля шляхів,
і лупить зухвалий Борей
моє листя тендітне.
А я нерухоме,
і сумно дивитись мені,
як блукають по диких шляхах
неприкаяні люди.
Я квітуче дерево
біля шляхів,
і знають чимало пісень
мої листя і квіти.
То ж почуйте мене,
зупиніться,
почуйте мене хоч на мить.
Все чекаю, коли прилетить
моя пташка осяйна.
Я цветущее дерево
среди дорог,
и летят мои лепестки
в бесконечное кружево мира.
И трагический танец
застыл в изломе ствола моего.
Я врастаю все крепче и вглубь
в эти камни и пепел.
И от хора орудий и песен,
речей и поэм
я храню в сердце кроны моей
крупицу безмолвия.
Прилетай,
моя светлая птица, скорей!
Здесь давно уже свито гнездо
твоему одиночеству.
Дерево (mp3) / 4m 23s — 4,01 Mb — 128 Kb/s
Tree by
Jorge Stolfi
Комментарии (0)
RSS свернуть / развернутьТолько зарегистрированные и авторизованные пользователи могут оставлять комментарии.