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 :: Рекурсивная функция [2]
Покинул форум
Сообщений всего: 16
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
DeepVarvar пишет:
Так мой пример разбирает весь массив из одного запроса по вложеностям и ничего не нужно будет при добавлении нового пункта переформировывать.
Зачем крутить лишние циклы и запросы?
Не понял что Вы хотели сказать. У человека стоит задача сначала сформировать массив от потомка до родителя, а потом с него уже что-то формировать. Судя по его примеру у него нет таблицы дерева связей, он работает напрямую с таблицей "категорий" - как он их называет. Как вы одним запросом в его случае достаните всех родителей в таблице вида:
А если в таблице 100 000 записей, будете их все в цикле пробегать, пока не соберете массив? Или будете искать в массиве с 100 000 элементов? Как по мне, лучше 20 запросов в БД.
Kubert
Отправлено: 25 Августа, 2011 - 10:03:55
Частый гость
Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010
DeepVarvar
Функция эта у меня есть(выше написал)! Но спасибо, Вам!
Но затея как раз и состояла в том чтобы в ссылке link прописывать полный путь потомков.
типа:
href="/?idObject1=111&idObject2=222&idObject3=333&idObject4=444"
где 444 активный пункт меню.
+ это поможет мне составить "строку навигации".
А может быть вообще гоню и такие вложенности делают по другому?!
egir
Добавлю WHERE так как у меня в одной таблице категорий лежат все категории для 300 сайтов. а в каждом сайте примерно от 5 до 50 пунктов.
Но я уже подумывал делать сохранять полный путь всех потомков в БД...
Вот теперь и незнаю что делать)
Но если я буду прописывать в БД полный путь потомков, типа "111,222,333,444",
мне все равно придется при добавлении или обновлении страницы, необходимо будет запускать эту злосчастную функцию
А касательно большого кол-во запросов. Уж не хотелось бы этого делать, так как для этого все и замутилось. В данный момент на сайтах стоят как раз такие "обработчики" которые в цикле обращаются постоянно к БД.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
egir
Отправлено: 25 Августа, 2011 - 10:54:55
Новичок
Покинул форум
Сообщений всего: 16
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Я раньше писал этот пример Kubert Вы пробывали? Он как раз возвращает массив, которой вроде Вам нужен. А если не хотите запросы, то нужно делать таблицу связей и формировать связи только при добавлении новой категории или что там у Вас. Я у себя так делаю, связи формируются достаточно быстро и один раз, а потом одним запросом (правда сложным), достается все что нужно.
Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010
Помог: 3 раз(а)
egir
м-м-м... у меня не работает... пытаюсь чтото менять всеравно не работает...
egir
Отправлено: 25 Августа, 2011 - 11:10:57
Новичок
Покинул форум
Сообщений всего: 16
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Kubert пишет:
egir
м-м-м... у меня не работает... пытаюсь чтото менять всеравно не работает...
а какая ошибка?
Kubert
Отправлено: 25 Августа, 2011 - 11:15:23
Частый гость
Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010
Помог: 3 раз(а)
egir
В том то и дело никакой! просто пустой экран (Добавление) EuGen
буду разбираться, пробывать! Спасибо!
EuGen
Отправлено: 25 Августа, 2011 - 11:17:25
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Kubert
Выбирайте данные одним запросом в формате массива id - parent_id
Превратить его в древовидный можно потом (как - я описал в своем предыдущем комментарии).
С древовидной структурой затем можно уже будет делать что требуется. Вдобавок, это не потребует огромного количества запросов.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Kubert
Отправлено: 25 Августа, 2011 - 11:20:01
Частый гость
Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010
Помог: 3 раз(а)
egir
И всеже если есть у нас уже имеется массив всех "категорий" с одним id потомком, то можно обойтись без запросов к БД. Это рациональнее. Так как к примеру у каждого четвертовложенного пункта придется делать 4 запроса... да?
egir
Отправлено: 25 Августа, 2011 - 11:23:44
Новичок
Покинул форум
Сообщений всего: 16
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Только учтите одно, что пока у вас пара сотней записей в таблицах БД, то с одним запросом будет все хорошо. Но когда их будет нескольк тесяч, посмотрите потом на объем памяти занимаемой скриптом, который достает эти все записи в массив и умножите их на кол-во обращений к старнице и будете "приятно" обобьем RAM требуемой для такого удовольствия.
Суть басни такова что при большом количестве записей ни один из выше предложенных способов не подойдет, хотя все работают, нужно будет дерево связей.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Kubert пишет:
придется делать 4 запроса
Нет, не так. Зависит от степени разветвленности дерева. Чем больше у каждого узла потомков, тем больше будет запросов.
Например, при уровне вложенности 3, если у каждого узла по 8 потомков и корневых узлов тоже 3, это будет
3+8*3+8*8*3=219 запросов.
egir пишет:
будете обобьем RAM требуемой для такого удовольствия
Несоизмеримо мал. Даже при большом уровне вложенности и разветвленности вряд ли будут заняты хотя бы 4-5Mb так как приведенные данные не занимают много места.
Памяти может не хватить, если каждый узел хранит большие текстовые данные. Но запросами в таком случае делать еще хуже.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
egir
Отправлено: 25 Августа, 2011 - 11:25:48
Новичок
Покинул форум
Сообщений всего: 16
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
EuGen пишет:
Kubert пишет:
придется делать 4 запроса
Нет, не так. Зависит от степени разветвленности дерева. Чем больше у каждого узла потомков, тем больше будет запросов.
Например, при уровне вложенности 3, если у каждого узла по 8 потомков и корневых узлов тоже 3, это будет
3+8*3+8*8*3=219 запросов.
Ничего подобного, он подымается от потомка к родителю, а не собирает всех потомков родителя. Так что запросов будет ровно столько, какая глубина вложенности.
EuGen
Отправлено: 25 Августа, 2011 - 11:27:23
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
egir пишет:
от потомка к родителю, а не собирает всех потомков родителя
в таком случае мы о разных задачах. А первоначально было нужно построить дерево.
Видимо, потому Ваш пример не подошел для автора.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.