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);
И в общем то и всё. Таким образом мы можем получить полное дерево категорий с бесконечными подкатегориями.
Добавить комментарий