ProfiPHPProfiPHP
Категория: Полезное в PHP

Построение дерева категорий на PHP

Наступает момент, когда программист сталкивается с проблемой построения дерева категорий. Давайте разберем реализацию такого дерева на PHP.

Структура таблицы должна иметь следующий вид:

1. id - ключ категории

2. parent_id - id родительской категории

3. name – название категории или раздела

Создадим таблицу, выполнив SQL-запрос:
CREATE TABLE `categories` (
`category_id` INT NOT NULL AUTO_INCREMENT,
`parent_id` INT NOT NULL ,
`category_name` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `id` )
);
В данной таблице главные категории будут иметь родительский ID равный 0, а все подкатегории — ID главной категории.

Для начала необходимо выполнить только один запрос к базе данных и выбрать все категории и ихние подкатегории в массив:
SELECT * FROM `category` ORDER BY `parent_id` ASC
В результате мы получим приблизительно следующий массив:
Array
(
[0] => Array
(
[1] => Array
(
[category_id] => 1
[parent_id] => 0
[category_name] => Детский мир
)
[2] => Array
(
[category_id] => 2
[parent_id] => 0
[category_name] => Недвижимость
)
)
[1] => Array
(
[3] => Array
(
[category_id] => 3
[parent_id] => 1
[category_name] => Одежда для мальчиков
)
[4] => Array
(
[category_id] => 4
[parent_id] => 1
[category_name] => Одежда для девочек
)
)
)
Выбираем все данные из таблицы categories и формируем ассоциативный массив, ключами которого будут ID родительской категорий.

А теперь пришло время построить рекурсивную функцию для вывода дерева в такой структуре:
<ul>
<li>Раздел 1
<ul>
<li>Раздел 1.1
<ul>
<li>Раздел 1.1.1</li>
</ul>
</li>
<li>Раздел 1.2</li>
</ul>
</li>
<li>Раздел 2
<ul>
<li>Раздел 1.1</li>
<li>Раздел 1.2</li>
</ul>
</li>
<li>Раздел 3
<ul>
<li>Раздел 3.1</li>
</ul>
</li>
</ul>
Далее в ц цикле формируем массив всех разделов, ключами будут ID родительских категорий, а также массив разделов с ключами ID категорий:
$cats = array(  );
while ( $row = $db->get_row( $sql_result ) ) {
$cats[$row['parent_id']][$row['category_id']] = $row;
}
Далее создаем функцию build_tree:
function build_tree( $cats, $parent_id, $only_parent = false )
{
if ( is_array( $cats ) && isset( $cats[$parent_id] ) )
{
$tree = '<ul>';
if ( $only_parent == false )
{
foreach ( $cats[$parent_id] as $cat ) {
$tree .= '<li>'.$cat['category_name'];
$tree .= build_tree($cats,$cat['category_id']);
$tree .= '</li>';
}
}
elseif ( is_numeric( $only_parent ) ) {
$cat = $cats[$parent_id][$only_parent];
$tree .= '<li>'.$cat['category_name'];
$tree .= build_tree( $cats, $cat['category_id'] );
$tree .= '</li>';
}
$tree .= '</ul>';
}
else {
return null;
}
return $tree;
}
Для вывода всех категорий с подкатегориями достаточно исполнить функцию:
echo build_tree( $cats, 0 )

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

Имя:
Текст комментария: