(0 - user rating)

Это конечно не лучший вариант для построения деревьев, но при не большом количестве ветвей работает достаточно быстро. Я использую класс для работы с базой 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}

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


Защитный код
Обновить