Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: пометить дерево sql - запроса в многомерный массив [2]
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
jonston пишет:
Получился двухмерный массив.А нужен многомерный массив с неограниченной вложенностью.
А можете рассказать, зачем вам именно сам массив древовидный? Его же все равно той же самой рекурсией выводить. Так какая разница, рекурсивно уточнять, существует ли $arr[ нужный подраздел ] или опять же уточнять, существует ли $cat_date[\w+]([\w+])*[\w+]
----- PostgreSQL DBA
Champion
Отправлено: 09 Мая, 2011 - 15:21:22
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
http://forum.php.su/topic.php?fo...1&topic=2497 вот тут долго и подробно разбирался вывод категорий и подкатегорий. Правда, загажено немного, но разобраться можно.
Дело в том, что многомерный массив с беконечным уровнем вложенности не нужен, а более эффективно тут подойдет другая структура:
либо структура, предложенная Мелким. Они просты и с точки зрения их выборки из базы и с точки зрения построения по ним меню. (Добавление)
Неограниченная вложенность на самом деле не нужна, а делать запрос за запросом - это очень не здорово.
komprenda
Отправлено: 09 Мая, 2011 - 15:47:01
Гость
Покинул форум
Сообщений всего: 105
Дата рег-ции: Май 2011
Помог: 3 раз(а)
jonston пишет:
Спасибо!Посмотри (ничего что я на ты?) вверху есть две функции которые реализуют именно вывод дерева.Она построена примерно по твоим рекомендациям.
Потом вместо вывода я сделал функцию которая делала конкотенацию строки для передачи ее в "view".Понял что это не удобно.Решил что нужно сначала сделать выборку и занести данные в многомерный массив с большим количеством вложенности.А потом уже передать этот массив в вид, в качестве данных.Именно массив нужен потому , что он гибок в использовании.Например мне не нужно лезть в контроллер чтобы изменить выводимые теги <li></li> на <options></options>.Понимаешь о чем я?
Покинул форум
Сообщений всего: 105
Дата рег-ции: Май 2011
Помог: 3 раз(а)
EuGen пишет:
jonston пишет:
Как это решить без рекурсии?
Без рекурсии у Вас не получится. Вам же нужна неограниченная вложенность.
Вообще древовидные струкруры в реляционной БД строятся "плохо" - то есть Вам приходится в любом случае делать запрос за запросом.
Иными словами:
0. Делаете запрос на выборку из таблицы, где parent_id=0
1. Пробегаетесь по строкам
2. Делаете запрос на выборку из таблицы, где parent_id=значению в текущей строке.
Для организации рекурсии нужно объединить запрос на выборку и перебор строк в одну функцию, принимающаю параметр id (это parent_id, по которому функция сделает выборку) и возвращающая все строки, у которых parent_id = переданному этой функции id.
этот способ не помню где был описан и почему-то все именно так и делают, хотя это в корне неправильно. зачем делать запрос за запросом, когда можно выбрать всё одним?
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Потому что это - как правило первое, что приходит в голову. Я упомянул, что древовидные структуры в реляционных БД строить плохо не просто так же.
Выше Champion привел пример для более правильной реализации (двумерный массив). Правда, это только для частного случая - а именно когда подчиненные объекты имеют одну и ту же структуру. В общем же случае (когда потомки могут иметь атрибуты, отсутствующие у предков), такой структурой, увы, не обойтись.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.