Mysql php дерево категорий

Примеры использования рекурсивной функции в PHP

Рекурсия — определение, описание, изображение какого-либо объекта или процесса внутри самого этого объекта или процесса, то есть ситуация, когда объект является частью самого себя. Другими словами, рекурсия — это вызов функции внутри самой себя.

Простой пример рекурсии в PHP

Ниже показан примитивный пример использования рекурсии. По сути, ничего полезного данный код не делает. Более того, такой скрипт (бесконечный) переполнит стэк и аварийно завершит свою работу. Мы получим ошибку: Fatal error: Uncaught Error: Maximum function nesting level of ‘256’ reached, aborting! .

function recursion() < recursion(); >recursion();

Факториал

Чтобы избавится от бесполезного и бесконечного вызова функции, необходимо прописать условие при котором эта функция вызывала бы сама себя, делая при этом что-то полезное и нужное. В классическом исполнение хорошо подходит пример функции вычисляющей факториал числа.

function factorial($n) < if ($n echo factorial(5); // 120

Факториал числа так же можно вычислить, применив цикл, полностью заменяющий рекурсию:

function factorial($n) < $result = 1; for ($i = 1; $i return $result; > echo factorial(5); // 120

Пример функции для защиты от XSS

Практически все данные (за редким исключением) из форм необходимо, во избежания XSS, пропускать через функцию htmlspecialchars() . Наша задача написать такую функцию, которая будет принимать массив (включая вложенные массивы) всех входящих данных и "прогонять" эти данные через встроенную функцию php htmlspecialchars() . И как раз здесь мы будем использовать рекурсию.

 $value) < // Перебираем исходный массив $result[$key] = xss($value); // Рекурсивно вызываем функцию xss >return $result; // Возвращаемый "защищённый" массив > return htmlspecialchars($data, ENT_QUOTES); // Если это не массив, то вызываем htmlspecialchars() > // Предположим, что в строке запроса у нас такая строка: // /?name=John&age=<>45 $data = xss($_REQUEST); // Вызываем функцию, передав туда в качестве аргумента весь REQUEST // Распечатаем результат var_dump($data);

Класс дерева категорий

В данном примере выведем дерево категорий, используя рекурсивный метод, написанный в ООП стиле.

CREATE TABLE IF NOT EXISTS category ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL, `parent_id` VARCHAR(40) NOT NULL, PRIMARY KEY ( id ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO category (`id`, `name`, `parent_id`) VALUES (1, 'Компьютеры и периферия', 0), (2, 'Комплектующие для ПК', 0), (3, 'Смартфоны и смарт-часы', 0), (4, 'Телевизоры и медиа', 0), (5, 'Игры и приставки', 0), (6, 'Аудиотехника', 0), (7, 'Фото-видеоаппаратура', 0), (8, 'Офисная техника и мебель', 0), (9, 'Компьютерные системы', 1), (10, 'Периферия', 1), (11, 'Программное обеспечение и аксессуары', 1), (12, 'Системные блоки', 9), (13, 'Моноблоки', 9), (14, 'Неттопы и компьютеры-флешки', 9), (15, 'Платформы', 9), (16, 'Игровые компьютеры', 12), (17, 'Компьютеры для офиса', 12), (18, 'Компьютеры для бизнеса', 12), (19, 'Сенсорные моноблоки', 13), (20, 'Моноблоки с IPS экраном', 13), (21, 'Моноблоки с VA экраном', 13), (22, 'Моноблоки с TN экраном', 13), (23, 'Основные комплектующие', 2), (24, 'Хранение данных и охлаждение', 2);
require 'Category.php'; $category = new Category(); $data = $category->getData(); $tree = $category->createTree($data); $category->renderTemplate($tree);

Основы хранения в БД древовидных структур можно почитать здесь.

Читайте также:  Покрыть дерево цветом венге

Источник

Snip Code

Строим дерево категорий MySQL и рекурсивная функция PHP

Применяется для постоения меню на сайте, дерева категорий каталогов и т.д.

на примере построим дерево категорий каталога нашего сайта

Решение

Структура базы данных

id - id категории
parent_id - id родительской категории
name - имя категории

// подключаемся к базе данных
// делаем выборку из таблицы категорий
$result = mysql_query ( "SELECT `id`, `parent_id`, `name` FROM `catalog_cats`" ) ;

// вызываем функцию и строим дерево
echo create_tree ( $cats , 0 ) ;
?>
[ php ]

Будут вопросы, спрашивайте 🙂

Демо работы функции

On-line построение дерева каталога нашего сайта

Рейтинг:

Если вы знаете более оригинальное, красивое, ЛУЧШЕЕ решение этой задачи, у вас есть шанс заработать 100 рублей. Если ваше решение будет признано лучшим, деньги ваши! Мы гарантируем выплату!

Даниил

Огромнейшее тебе спасибо, даже не представляешь насколько помог!
Комментарий добавлен 29-11-2012 в 18:43:27 ID# 59
Ответить на комментарий пользователя Даниил

SnipCode.ru

Не за что, заходите к нам почаще )
Комментарий добавлен 29-11-2012 в 18:56:50 ID# 60
Ответить на комментарий пользователя SnipCode.ru

Олег

Добрый день! Скрипт действительно работает, но никак не могу адаптировать его под свой проект. Дело в том, что у меня в левом блоке сайта раздвижной двухуровневый каталог товаров, при применении Вашего скрипта каталог выводится с подкаталогами, но проблема в том, что ссылки нужно установить только для второго уровня, а в Вашем скрипте получается, что только для всех уровней можно сделать, а как прописать отдельно для главного уровня и отдельно для подуровней?
Комментарий добавлен 03-03-2013 в 14:08:03 ID# 151
Ответить на комментарий пользователя Олег

229932

Дайте пожалуста отват как добавить одну запись из формы в зависимости от города.

Читайте также:  Дизайн качели из дерева

SnipCode.ru

А как Вы пробуете вставить? Что именно не получается?
Комментарий добавлен 27-09-2013 в 10:04:45 ID# 195
Ответить на комментарий пользователя SnipCode.ru

Источник

Creating a recursive category tree function

I'm trying to build a recursive tree script in PHP, but I'm stuck. Here's what I have so far. I'm stuck on what to do between the else: and endif; in the foreach. (And I'm using that syntax just for easier reading here.) Any suggestions?

    '; foreach($array as $key => $value): if ($value['parent'] == $parent): $output .= '
  • '; if ($value['parent'] == NULL): $output .= $value['name']; else: endif; endif; $output .= ''; endforeach; $output .= '

EDIT 1 I was able to get this working, although I have a database call in a foreach loop, which probably isn't the best idea:

    '; foreach($array as $key => $value): if ($value['parent'] == $parent): $output .= '
  • '; if ($value['parent'] == NULL): $output .= $value['name']; $subcategories = ci()->db->get_where('categories', array('parent' => $value['id'])); if ($subcategories->num_rows() > 0): $output .= $this->makeTree($value['id'], $subcategories->result_array()); endif; else: $output .= $value['name']; $output .= ''; endif; endif; endforeach; $output .= '
    '; foreach($array as $key => $value): if ($value['parent'] == $parent): $output .= '
  • '; if ($value['parent'] == NULL): $output .= $value['name']; $matches = array(); foreach($array as $subkey => $subvalue): if ($subvalue['parent'] == $value['id']): $matches[$subkey] = $subvalue; endif; endforeach; $output .= $this->makeTree($value['id'], $matches); else: $output .= $value['name']; $output .= ''; endif; endif; endforeach; $output .= '

Источник

PHP:Как вывести дерево категорий?

введите сюда описание изображения

наткнулся на статью хорошо описано про создания дерево категории, но функция вернет ответь в готовый html но я хочу получать дерево в массиве структура такая:

введите сюда описание изображения

результат в виде html: Вопрос: возможно ли получит дерево категории в виде массива не зависимо от вложенности

ну как бы завернуть дерево в массив а не в готовом html, а почему вы считаете что статья не очень возможно вы знаете более легкий красивый код и логики?

Читайте также:  Все виды вишневых деревьев

Можно просто ввести левое и правое плечо в базу данных, и level уровень. Выбираете эти данные из базы в одномерный массив с учётом левого и правого плеча. И рендерите одномерный массив на html+css.

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

Это только элюзия, а вообще li формируеться просто введи результирующий массив вместо $tree и там var_dump . p.s. Рекурсию сложно дебажить к примеру, ` return ` в функции вернёт в выполнение предыдущего вызова функции.

2 ответа 2

Вопрос: возможно ли получит дерево категории в виде массива не зависимо от вложенности ?

Отвечаю на этот вопрос во втором примере ! Хотя и первый тоже может понадобится.В моём коде он выводит категории в dropdown lists(. ) .

Примечание : mysql_fetch_assoc($result) вернёт вам вот такой массив:

$arr = [ [ 'id' => 1, 'parent_id' => 0, 'name' => 'Раздел 1' ], [ 'id' => 2, 'parent_id' => 0, 'name' => 'Раздел 2' ], [ 'id' => 3, 'parent_id' => 0, 'name' => 'Раздел 3' ], [ 'id' => 4, 'parent_id' => 1, 'name' => 'Раздел 1.1' ], [ 'id' => 5, 'parent_id' => 1, 'name' => 'Раздел 1.2' ], [ 'id' => 6, 'parent_id' => 4, 'name' => 'Раздел 1.1.1' ], [ 'id' => 7, 'parent_id' => 2, 'name' => 'Раздел 2.1' ], [ 'id' => 8, 'parent_id' => 2, 'name' => 'Раздел 2.2' ], [ 'id' => 9, 'parent_id' => 3, 'name' => 'Раздел 3.1' ] ]; 

Дальнейшие примеры будут приведены исходя из данного массива $arr ,который может иметь безграничную вложенность иерархий (id -> parent_id ).По крайней мере столько сколько позволено стеков в рекурсии.По моему равен 1000.

1.Результат: Одномерный массив указывающий глубину вложенности через черточку - :

function CreateTree($array,$sub=0,$tab='') < //asort($array); $category=array(); if($sub>0) foreach($array as $v) < if($sub == $v['parent_id'])< $category[$v['id']] = $tab.$v['name']; $category += CreateTree($array,$v['id'],$tab); >> return $category; > echo '
'; print_r(CreateTree($arr)); 

2. Результат: Многомерный массив с иерархической вложенностью:

function CreateTree($array,$sub=0) < $a = array(); foreach($array as $v) < if($sub == $v['parent_id']) < $b = CreateTree($array,$v['id']); if(!empty($b)) $a[$v['name']] = $b; else $a[$v['id']] = $v['name']; >> return $a; > echo "
"; print_r(CreateTree($arr)); 

Источник

Оцените статью