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 - запроса в многомерный массив
Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011
Помог: 3 раз(а)
Всем привет!Вопрос такой:
Есть таблица базы данных:
Если кто заметил категории связываются ключом parent_id.Категории могут быть бесконечной вложенности.
Вывести дерево категорий у меня получилось.А вот как мне занести все это дело в многомерный массив?Чтобы примерно получилось вот так:
Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011
Помог: 3 раз(а)
обрати внимание что я написал вверху рекурсивную функцию и к ней вспомогательную.Они выводят дерево категорий.Вопрос стоит что бы не выводить а занести данные в массив для дальнейшей передачи их в вид.
Но все равно спасибо за ответ!
Покинул форум
Сообщений всего: 105
Дата рег-ции: Май 2011
Помог: 3 раз(а)
jonston пишет:
обрати внимание что я написал вверху рекурсивную функцию и к ней вспомогательную.Они выводят дерево категорий.Вопрос стоит что бы не выводить а занести данные в массив для дальнейшей передачи их в вид.
Но все равно спасибо за ответ!
у тебя в ней 1000 и 1 выборка из базы лучше выбрать всё сразу
jonston
Отправлено: 09 Мая, 2011 - 12:19:00
Посетитель
Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011
Помог: 3 раз(а)
Да я в курсе что в плане оптимизации запроса далеко не самый лучший вариант.
Вопрос состоит не в этом.Вопрос состоит в том как использовать рекурсию чтобы правильно создать массив данных.
----- $i = 0;
$i = $i++ + ++$i; ?
Мелкий
Отправлено: 09 Мая, 2011 - 12:28:18
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
jonston пишет:
Вопрос состоит в том как использовать рекурсию чтобы правильно создать массив данных.
А зачем рекурсия-то?
Выбираете из таблицы все строки и загоняете в двухмерный массив:
Получился двухмерный массив.А нужен многомерный массив с неограниченной вложенностью.Как это решить без рекурсии?Заранее благодарю!
P.S. Массив который должен получится смотри вверху этого топика.
----- $i = 0;
$i = $i++ + ++$i; ?
EuGen
Отправлено: 09 Мая, 2011 - 14:21:25
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
jonston пишет:
Как это решить без рекурсии?
Без рекурсии у Вас не получится. Вам же нужна неограниченная вложенность.
Вообще древовидные струкруры в реляционной БД строятся "плохо" - то есть Вам приходится в любом случае делать запрос за запросом.
Иными словами:
0. Делаете запрос на выборку из таблицы, где parent_id=0
1. Пробегаетесь по строкам
2. Делаете запрос на выборку из таблицы, где parent_id=значению в текущей строке.
Для организации рекурсии нужно объединить запрос на выборку и перебор строк в одну функцию, принимающаю параметр id (это parent_id, по которому функция сделает выборку) и возвращающая все строки, у которых parent_id = переданному этой функции id.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
jonston
Отправлено: 09 Мая, 2011 - 14:37:04
Посетитель
Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011
Помог: 3 раз(а)
Спасибо!Посмотри (ничего что я на ты?) вверху есть две функции которые реализуют именно вывод дерева.Она построена примерно по твоим рекомендациям.
Потом вместо вывода я сделал функцию которая делала конкотенацию строки для передачи ее в "view".Понял что это не удобно.Решил что нужно сначала сделать выборку и занести данные в многомерный массив с большим количеством вложенности.А потом уже передать этот массив в вид, в качестве данных.Именно массив нужен потому , что он гибок в использовании.Например мне не нужно лезть в контроллер чтобы изменить выводимые теги <li></li> на <options></options>.Понимаешь о чем я?
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.