PHP Категории (Дерево категорий)

Иерархическая

 

Сегодня наша цель, создать иерархическую структуру категорий. Нам важно чтобы было удобно хранить категории и чтобы было легко выводить их там где нам надо.

Иногда простое кажется сложным, именно по этому выложу несколько фрагментов кода, которые я надеюсь вам пригодятся для реализации php категорий в виде дерева.

Итак, структура должна состоять из id категории (id), из названия категории (name) и конечно id родительской категории (parent_id). В MySQL это выглядит так:


CREATE TABLE IF NOT EXISTS `category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`parent_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

Минимальная и понятная структура таблицы для хранения категорий.

Заполняем таблицу нашими категориями


INSERT INTO `category` (`id`, `name`, `parent_id`) VALUES
(1, 'Телефоны и планшеты', '0'),
(2, 'Автомобили', '0'),
(3, 'Samsung', '1'),
(4, 'Apple', '1'),
(5, 'LG', '1'),
(6, 'Ford', '2'),
(7, 'Lexus', '2'),
(8, 'BMW', '2'),
(9, 'Galaxy Tab 4', '3'),
(10, 'Galaxy S6', '3');

Там где значение parent_id=0, у данной категории нет родительской категории.

Тут все понятно и просто. Теперь присутпим к выводу списка категорий. Но для правильного вывода списка, нам нужно сначала получить весь список php категорий, а уже потом с помощью рекурсии сформировать наше дерево. Следующая функция предназначена для получения этого списка:


function get_cat() {
//запрос к базе данных
$sql = "SELECT * FROM category";
$result = mysql_query($sql);
if(!$result) {
return NULL;
}
$arr_cat = array();
if(mysql_num_rows($result) != 0) {

//В цикле формируем массив
for($i = 0; $i < mysql_num_rows($result);$i++) {
$row = mysql_fetch_array($result,MYSQL_ASSOC);

//Формируем массив, где ключами являются адишники на родительские категории
if(empty($arr_cat[$row['parent_id']])) {
$arr_cat[$row['parent_id']] = array();
}
$arr_cat[$row['parent_id']][] = $row;
}
//возвращаем массив
return $arr_cat;
}
}

Дальше нам надо запустить эту функция для получения массива


//получаем массив каталога
$result = get_cat();

Теперь нужна функция с рекурсией


function view_cat($arr,$parent_id = 0) {

//Условия выхода из рекурсии
if(empty($arr[$parent_id])) {
return;
}
echo '<ul style="padding-left:10px;">';
//перебираем в цикле массив и выводим на экран
for($i = 0; $i < count($arr[$parent_id]);$i++) {
echo '<li><a href="?category_id='.$arr[$parent_id][$i]['id'].
'&parent_id='.$parent_id.'">'
.$arr[$parent_id][$i]['name'].'</a>';
//рекурсия - проверяем нет ли дочерних категорий
view_cat($arr,$arr[$parent_id][$i]['id']);
echo '</li>';
}
echo '</ul>';

}

Теперь осталось только вывести каталог на экран с помощью рекурсивной функции


view_cat($result);

И в общем то и всё. Таким образом мы можем получить полное дерево категорий с бесконечными подкатегориями.


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

Ваш e-mail не будет опубликован. Обязательные поля помечены *