Это конечно не лучший вариант для построения деревьев, но при не большом количестве ветвей работает достаточно быстро. Я использую класс для работы с базой MySQL, ее описанием я заниматься не буду.
-- -- Структура таблицы `article_cat` -- CREATE TABLE IF NOT EXISTS `article_cat` ( `cat_id` int(10) unsigned NOT NULL auto_increment, `parent_id` int(11) NOT NULL default '0', `cat_name` varchar(255) collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`cat_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ; -- -- Дамп данных таблицы `article_cat` -- INSERT INTO `article_cat` (`cat_id`, `parent_id`, `cat_name`) VALUES (1, 0, '1'), (2, 0, '2'), (3, 1, '1.1'), (4, 3, '1.1.1'), (5, 3, '1.1.2'), (6, 2, '2.1'), (7, 2, '2.2');
дамп массива который нам нужно получить (для краткости я сокращу закрывающие скобки)
Array(
[0] => Array([cat_id] => 0
[cat_name] => Корень
[child] => Array(
[1] => Array([cat_id] => 1
[cat_name] => 1
[child] => Array(
[3] => Array([cat_id] => 3
[cat_name] => 1.1
[child] => Array(
[4] => Array([cat_id] => 4
[cat_name] => 1.1.1
[child] => Array()
[5] => Array([cat_id] => 5
[cat_name] => 1.1.2
[child] => Array(
[8] => Array(
[cat_id] => 8
[cat_name] => 1.1.2.1
[child] => Array()
[2] => Array([cat_id] => 2
[cat_name] => 2
[child] => Array(
[6] => Array([cat_id] => 6
[cat_name] => 2.1
[child] => Array()
[7] => Array([cat_id] => 7
[cat_name] => 2.2
[child] => Array(
[9] => Array([cat_id] => 9
[cat_name] => 2.2.1
[child] => Array()
)
article.php
[...]
$article_tree[] = array('cat_id'=>0,
'cat_name'=>$_LANG['root_cat'],
'child'=>get_article_tree());
$smarty->assign('article_tree', $article_tree);
$smarty->display('article_list.tpl');
[...]
function get_article_tree($pid = 0)
{
$row = array();
$sql = 'SELECT * FROM ' . $GLOBALS['cms']->table('article_cat') .
' WHERE parent_id = ' . $pid ;
$res = $GLOBALS['db']->getAll($sql);
if (count($res) > 0)
{
foreach ($res as $value)
{
$row[$value['cat_id']]['cat_id'] = $value['cat_id'];
$row[$value['cat_id']]['cat_name'] = $value['cat_name'];
$row[$value['cat_id']]['child'] = get_article_tree($value['cat_id']);
}
}
return $row;
}
[...]
article_list.tpl
[...]
{$lang.cat_tree}
{include file="library/tree.lbi" root=$article_tree}
[...]
library/tree.lbi
{foreach from=$root item=level}
{$level.cat_name}
{if (!empty($level.child))}
{include file="library/tree.lbi" root=$level.child}
{/if}
{/foreach}
