![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
qsajeal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.8.2008 Репутация: нет Всего: нет |
Здравствуйте! У меня следующая проблема:
У меня есть каталоги неограниченной вложенности: таблица categ содержит поля: с_id (первичный ключ) pc_id (первичный ключ родительской категории) таблица articles содержит поля: a_id c_id(первичный ключ категории в которой находится статья) ----- Причем в категории могут быть как другие категории, так и статьи ---- Нужно написать скрипт, который будет динамически формировать древовидное меню в виде списка(беря данные из бд, которые естетвенно меняются постоянно), а этот список уже с помощью одного плагина jQuery преобразуется в древовидное меню Пример списка: <li><span class="folder">Folder 1</span> <ul> <li><span class="file">Item 1.1</span></li> <li><span class="file">Item 1.2</span></li> <li><span class="file">Item 1.3</span></li> <li><span class="file">Item 1.4</span></li> <li><span class="file">Item 1.5</span></li> </ul> </li> <li class="closed"><span class="folder">Folder 2</span> <ul> <li><span class="folder">Subfolder 2.1</span> <ul id="folder21"> <li><span class="file">File 2.1.1</span></li> <li><span class="file">File 2.1.2</span></li> <li><span class="file">File 2.1.3</span></li> <li><span class="file">File 2.1.4</span></li> <li><span class="file">File 2.1.5</span></li> <li><span class="file">File 2.1.6</span></li> <li><span class="file">File 2.1.7</span></li> </ul> </li> Я уже 2 дня думаю как это сделать. Вот если бы уровень вложенности был известен, то легко. А универсального решения найти не могу. ПОМОГИТЕ МНЕ ПОЖАЛУЙСТА. Задача ведь действительно интересная и решение может часто использоваться. |
|||
|
||||
solenko |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 2 Всего: 67 |
qsajeal, а вы нопишите для вложенности, скажем..., 3. А потом мы уже будем смотреть как ваш скрипт переделать.
*с вашей структурой базы обычно используется рекурсивная функция. Ну и так, на всякий случай, про другие методы хранения деревьев можно почитать поуглив materialized path или Nested Sets -------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
|||
|
||||
qsajeal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.8.2008 Репутация: нет Всего: нет |
Даже на примере первой директории. И так до бесконечности... |
|||
|
||||
gEndelf |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 7.7.2005 Где: the world Репутация: нет Всего: 3 |
а ты не задумывался - сколько запросов к базе будет ?
![]() в Oracle есть иерархические запросы, в MySQL с этим сражаются другим оружием ) Сцылка 1 ну и погугли - по запросу "Mysql hierarhical queries" |
|||
|
||||
solenko |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 2 Всего: 67 |
я тут пофантазировал на счет того как это все за лдин запрос выбрать...
-------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
|||
|
||||
qsajeal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.8.2008 Репутация: нет Всего: нет |
А как это теперь сделать, чтобы списком выводило?
|
|||
|
||||
Anarki |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 14.3.2005 Репутация: 1 Всего: 11 |
Использованы данные и функция выше.
Вообще тут простейшая рекурсия.
На выходе такая красота
Это сообщение отредактировал(а) Anarki - 14.8.2008, 22:50 |
||||
|
|||||
qsajeal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.8.2008 Репутация: нет Всего: нет |
А зачем он выводит все папки сразу, как сделать, чтобы только Item 1-4?
|
|||
|
||||
qsajeal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.8.2008 Репутация: нет Всего: нет |
Ну наступил некоторый прогресс
![]() Я понял как работает функция normolize!!! Теперь понял как выводится дерево. Теперь вопрос: Как остановить рекурсию на стадии когда закончится обход тех пунктов, которые лежат в null??? |
|||
|
||||
qsajeal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.8.2008 Репутация: нет Всего: нет |
Я сделал. Просто нужно было оказываетс удалить все элементы ненужные из нормализованного массива:
Теперь надо подумать, как это связать с таблицей статей? |
|||
|
||||
qsajeal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.8.2008 Репутация: нет Всего: нет |
Подскажите пожалуйста как сделать??? ![]() Я могу конечно внести в этот же массив все данные из таблицы articles, но мне нужно сохранить id этих статей, чтобы потом ссылки делать. |
|||
|
||||
solenko |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 2 Всего: 67 |
Затем, что имнно такой вопрос вы задавали в начале темы Добавлено через 2 минуты и 31 секунду У меня не было вашей тпблицы, поэтому массив записан в исходнике. Что мешает передать в normolize результат mysql_fetch_assoc? Скрипт, который я привел, не предназначен для практического использования. Два скрипта в теме -- просто пример, опираясь на который нужно сделать решение, подходящее вам. -------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
|||
|
||||
Boxa |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 25.10.2006 Репутация: -2 Всего: -2 |
рекурсия. 1 таблица id, idp, text. Можно все сделать через JavaScript, но это еще геморнее
![]() |
|||
|
||||
Zmiuko |
|
||||
![]() http://zmiuko.ru ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 8.10.2008 Репутация: нет Всего: 2 |
Вопрос такой, почему функция normolize выводит
где последние
являются лишними, поскольку уже были выведены и как это исправить? |
||||
|
|||||
evilsoul |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 31.3.2006 Репутация: нет Всего: 0 |
Ответ на твой вопрос прост, есть куча алгоритмов хранения деревьев, чтоб вывести все дерево сразу, тебе как мне кажеться поможет алгорит про сбалансированые деревья, тогда дерево достаеться одним запросом, плох он тем что при добавлении приходиться делать дополнительные манипуляции
Это сообщение отредактировал(а) evilsoul - 9.11.2008, 19:25 |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |