Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сортировка двухмерного массива, usort?
 
 автор: rised   (29.03.2007 в 18:26)   письмо автору
 
 

Здравствуйте, товарищи и коллеги!

Для меня всегда самым сложным является решение логики алгоритма, я придумываю решение, но оно кажется ужасно неповоротливым, в то же время прочтение документации по usort также не дает ответов.

Дано:
Есть рекурсивная функция, которая выводит объявления в категории и всех подкатегориях.
Таблица в БД имеет поля:
artId - идентификатор
parentCatId - идентификатор категории объявления
artDate - дата добаления

Саму рекурсивную функцию я брал с этого форума, поэтому думаю всем понятно что происходит.

Проблема возникла при выводе объявлений, так как нарушается сортировка по дате, объявления вызываются по схеме "сверху-вниз", соответственно сначала выводятся все объявления категории, отсортированные по дате, а потом все объявления подкатегории и они тоже сортируются по дате, но в рамках своей подкатегории. Количество уровней вложений неограничено...

Таким образом, порядок сортировки нарушен.
Не знаю простит ли меня бог программистов, но я решил сделать сортировку через двумерный массив - все объявления рекурсивной функцией закидываются в массив вида $allAds[$i][ ] - где $i = порядок сортировки.

И я застрял на сортировке этого массива по полю $allAds[$i][artDate ], которое имеет вид 2007-03-29

Что я сделал:
Проход по двумерному массиву с составление нового массива вида
ключ = порядок сортировки => значение = artDate, далее отсортировал arsort...

Ну и подумал, что сейчас я обалдею, если начну снова проход по массиву и если есть соответствие artDate и индекса полученного массива (Господи, вот поэтому я и путаюсь в этих бесконечных массивах, массивах, циклах, циклах) = вывожу объявление и так для каждого объявления.

Поэтому если кто-нибудь объяснит мне немного подробнее как составить функцию для такой сортировки, чтобы использовать usort - буду крайне благодарен.

Или это вообще неправильный путь? И следует задуматься как добавлять значения в двумерный массив после выборки из БД в соответственном порядке? (ну тут я тоже голову сломал)

help?

Спасибо!

   
 
 автор: Trianon   (29.03.2007 в 18:53)   письмо автору
 
   для: rised   (29.03.2007 в 18:26)
 

Прочтя задачу несколько раз, я так до конца и не уяснил, что требовалось правильно выбрать: категории или объявления.

>Таблица в БД имеет поля:
>artId - идентификатор
>parentCatId - идентификатор категории объявления
>artDate - дата добаления

Эта таблица описывает категории? Тогда в ней лишнее поле artDate, а ключи называются... хм... странно.
Или эта таблица описывает сами объявления?
Тогда в ней странно называется только ключ parentCatId...
В этом случае напрашивается просто применить ORDER BY при выборке объявлений.

В любом случае, сортировка уровня php здесь не нужна. Всё решается by 'order by'

   
 
 автор: rised   (29.03.2007 в 21:15)   письмо автору
 
   для: 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
(это объявления относятся к ВАЗ, они отсортированы по дате, но общая сортировка нарушена)

   
 
 автор: Trianon   (29.03.2007 в 21:42)   письмо автору
 
   для: rised   (29.03.2007 в 21:15)
 

Т.к. объявления суть лиейный список, безо всякой рекурсивной природы, то загрузку и вывод объявлений (если Вы не хотите упорядочивать их по категориям) нужно производить не рекурсивным вызовом, а единственным

SELECT * FROM bbs_articles WHERE parentCatId IN($cat_list) ORDER BY artdate

Список $cat_list можно накаливать двояко.
1. Набором рекурсивных запросов (как это обычно советуют на этом форуме)
2. Одним запросом по всем категориям с последующим построением дерева и его рекурсивным обходом средствами php. Если таблица дерева не очень объемна или отделена от тяжелых данных, это всяко более оптимальный вариант.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования