![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| mark2011 |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 28.6.2011 Репутация: 2 Всего: 2 |
Избитая, конечно, тема, ну да ладно....
В прикреплённом файлике структура таблицы. Задача проста - вывести её на экран. Делаю так:
Так, занесли в переменную корень дерева... Хорошо, идём дальше...
Логично, правда? Посмотрите на рисунок: у корня cat_id=29, он же parent_id у второго элемента. Казалось бы, повторяй эту конструкцию в цикле, ан нет... У элемента "1.1.1" cat_id=31, но не существует элемента, у которого parent_id=31. Значит автоматически указанное выше условие рекурсии недействительно. Из этого совершенно непонятно условие выхода из рекурсии... если честно, я даже его словами не могу сформулировать... Знаю, что существуют обходы деревьев (префиксный, постфиксный и инфиксный) но, насколько я знаю, это для деревьев Nested Sets, там где используется left_id, right_id... А у меня очень простая структура. В общем то надо условие повтора (ради чего рекурсия) и условие выхода из рекурсии... Всем откликнувшимся огромное спасибо Присоединённый файл ( Кол-во скачиваний: 34 )
dbtree.jpg 23,88 Kb |
||||
|
|||||
| Sanchezzz |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1670 Регистрация: 19.11.2006 Где: Voronezh Репутация: 41 Всего: 60 |
что то типо того должно быть я так понимаю ?
parent_id должен быть в таблицы по дефолту стоять 0 по умолчанию если он не является потомком. -------------------- Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS. |
|||
|
||||
| mark2011 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 28.6.2011 Репутация: 2 Всего: 2 |
Sanchezzz,
Такой вариант не работает однозначно, я проверил. Но вот о чём я задумался.... в принципе дерево можно всё за один проход передать в массив и дальше уже работать с этим массивом. С другой стороны, дерево может быть очень большое и массив может получиться огромный. Вот.... возникает вопрос, где будет больше накладных расходов - при прохождении массивом, или прямым рекурсивным выводом из базы? |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
нет никакой разницы откуда получать данные, из базы или массива
на приведенном рисунке существует... но допустим что нет. это означает, что этот элемент - лист. конец рекурсии. вот если бы наоборот, parent_id != 0, но элемента с таким cat_id нет. это означает, что целостность данных нарушена. возможно, такая ситуация вполне штатная, просто при обновлениях базы забыли про это поле. тогда просто следует принять решение (с точки зрения задачи), что означают такие записи. очевидных варианта два: либо считать данный элемент корнем еще одного дерева (parent_id=0) либо просто не рассматривать его. вообще, если мы идем от корня (начиная с parent_id = 0), узлы с несуществующими родителями нам просто не вернутся из базы. что мешает этому варианту работать? Добавлено @ 10:05 http://codepad.org/dPYKaHtG Это сообщение отредактировал(а) baldina - 2.8.2011, 10:24 |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
нельзя сказать однозначно. зависит от размера данных, нагрузки на базу, нагрузки на сервер php. по возможности всю работу целесообразно переложить на СУБД, выполняя иерархический запрос. Напрямую иерархические запросы могут не поддерживаться, это потребует программирования на стороне СУБД |
|||
|
||||
| нуп |
|
|||
|
Ботокодер ![]() ![]() Профиль Группа: Участник Сообщений: 987 Регистрация: 22.6.2009 Где: Кременчуг Репутация: нет Всего: 33 |
Да тупо кэшировать категории и всё
|
|||
|
||||
| CruorVult |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 868 Регистрация: 24.9.2008 Где: г.Киев, Украина Репутация: 9 Всего: 28 |
А зачем вытаскивать всё дерево ? Если оно очень большое - юзеру думаю не в кайф будет листать всё. Обычно вытягивается верхний уровень и потом аяксом вытягивается нужные подкатегории. |
|||
|
||||
| mark2011 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 28.6.2011 Репутация: 2 Всего: 2 |
CruorVult,
В некоторых случаях - да. Но у меня была ситуация, когда потребовалось тянуть всё дерево, аякс работал, но был неприемлем для заказчика. baldina, Ну по вашей логике: существует элемент с cat_id = 32, но не существует элемента parent_id = 32. Этот элемент лист - конец рекурсии. А элемент с cat_id = 33? Получается что он вообще не войдёт в выборку? |
|||
|
||||
| CruorVult |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 868 Регистрация: 24.9.2008 Где: г.Киев, Украина Репутация: 9 Всего: 28 |
||||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: -1 Всего: 17 |
если таблица с одним деревом не 100гиг, то можно использовать Nested Set и еще примеры есть с innodb
|
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
да
это от вас зависит, как вы хотите. или не войдет, или будет на верхнем уровне (как будто его parent_id=0) вообще-то я все это уже говорил. и пример вам сделал, работающий с вашими данными Добавлено через 57 секунд http://codepad.org/dPYKaHtG смотрели? Добавлено через 6 минут и 33 секунды и вот это http://codepad.org/HwoD1QWJ |
||||
|
|||||
| mark2011 |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 28.6.2011 Репутация: 2 Всего: 2 |
Ну что ж, заново открываю мной же созданную тему...
Итак, структура базы данных та же. Вариант, предложенный Sanchezzz, после допиливания работает, но выдаёт следующее:
Т.е. как бы нормально, НО: Почему-то уровень всё время первый, т.е. невозможно однозначно отследить где начинается потомок. Вот мой допиленный код:
|
||||
|
|||||
| MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
-------------------- Amazing |
|||
|
||||
| mark2011 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 28.6.2011 Репутация: 2 Всего: 2 |
Я не могу использовать вложенные множества. Во-первых это потребует изменения структуры таблицы, во вторых у меня не такое разветвлённое дерево. Изменять структуру таблицы не нужно.
|
|||
|
||||
| MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
mark2011, плодите тогда запросы к СУБД. Это ваше право, наше дело предложить
-------------------- Amazing |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |