|
|
|
| Здравствуйте, товарищи и коллеги!
Для меня всегда самым сложным является решение логики алгоритма, я придумываю решение, но оно кажется ужасно неповоротливым, в то же время прочтение документации по usort также не дает ответов.
Дано:
Есть рекурсивная функция, которая выводит объявления в категории и всех подкатегориях.
Таблица в БД имеет поля:
artId - идентификатор
parentCatId - идентификатор категории объявления
artDate - дата добаления
Саму рекурсивную функцию я брал с этого форума, поэтому думаю всем понятно что происходит.
Проблема возникла при выводе объявлений, так как нарушается сортировка по дате, объявления вызываются по схеме "сверху-вниз", соответственно сначала выводятся все объявления категории, отсортированные по дате, а потом все объявления подкатегории и они тоже сортируются по дате, но в рамках своей подкатегории. Количество уровней вложений неограничено...
Таким образом, порядок сортировки нарушен.
Не знаю простит ли меня бог программистов, но я решил сделать сортировку через двумерный массив - все объявления рекурсивной функцией закидываются в массив вида $allAds[$i][ ] - где $i = порядок сортировки.
И я застрял на сортировке этого массива по полю $allAds[$i][artDate ], которое имеет вид 2007-03-29
Что я сделал:
Проход по двумерному массиву с составление нового массива вида
ключ = порядок сортировки => значение = artDate, далее отсортировал arsort...
Ну и подумал, что сейчас я обалдею, если начну снова проход по массиву и если есть соответствие artDate и индекса полученного массива (Господи, вот поэтому я и путаюсь в этих бесконечных массивах, массивах, циклах, циклах) = вывожу объявление и так для каждого объявления.
Поэтому если кто-нибудь объяснит мне немного подробнее как составить функцию для такой сортировки, чтобы использовать usort - буду крайне благодарен.
Или это вообще неправильный путь? И следует задуматься как добавлять значения в двумерный массив после выборки из БД в соответственном порядке? (ну тут я тоже голову сломал)
help?
Спасибо! | |
|
|
|
|
|
|
|
для: rised
(29.03.2007 в 18:26)
| | Прочтя задачу несколько раз, я так до конца и не уяснил, что требовалось правильно выбрать: категории или объявления.
>Таблица в БД имеет поля:
>artId - идентификатор
>parentCatId - идентификатор категории объявления
>artDate - дата добаления
Эта таблица описывает категории? Тогда в ней лишнее поле artDate, а ключи называются... хм... странно.
Или эта таблица описывает сами объявления?
Тогда в ней странно называется только ключ parentCatId...
В этом случае напрашивается просто применить ORDER BY при выборке объявлений.
В любом случае, сортировка уровня php здесь не нужна. Всё решается by 'order by' | |
|
|
|
|
|
|
|
для: Trianon
(29.03.2007 в 18:53)
| | Да, я не надеялся, что смогу объяснить в такой краткой форме...
Trianon, есть таблица объявлений bbs_articles:
artId
author
phone
artName
email
parentCat (просто название категории - чтобы не делать доп. запрос к БД)
term
fullContent
views
artDate (формат date)
moderConfirm
artDateUser (формат текст - записывается автоматически - чтобы не форматировать дату из БД каждый раз)
parentCatId
Например есть две категории:
1) Автомобили
а) ВАЗ
В Автомобилях есть два объявления от 23.03.2007 и от 24.03.2007
В подкатегории ВАЗ тоже два объявлений поданых в эти же дни 23.03.2007 и от 24.03.2007
Как вывести содержимое двух категорий по порядку?
Потому что у меня вывод объявлений осуществляет рекурсивная функция, сначала категорию - потом подкатегорию и т.д. Вывод получается:
Автомобили
24.03.2007
23.03.2007
(далее функция выводит по дате объявления подкатегории)
24.03.2007
23.03.2007
(это объявления относятся к ВАЗ, они отсортированы по дате, но общая сортировка нарушена) | |
|
|
|
|
|
|
|
для: rised
(29.03.2007 в 21:15)
| | Т.к. объявления суть лиейный список, безо всякой рекурсивной природы, то загрузку и вывод объявлений (если Вы не хотите упорядочивать их по категориям) нужно производить не рекурсивным вызовом, а единственным
SELECT * FROM bbs_articles WHERE parentCatId IN($cat_list) ORDER BY artdate
|
Список $cat_list можно накаливать двояко.
1. Набором рекурсивных запросов (как это обычно советуют на этом форуме)
2. Одним запросом по всем категориям с последующим построением дерева и его рекурсивным обходом средствами php. Если таблица дерева не очень объемна или отделена от тяжелых данных, это всяко более оптимальный вариант. | |
|
|
|