| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Сортировка списка категорий |
| Автор: SergV 14.6.2008, 12:43 |
| Вобщем нужна помощь, сам не успеваю разобраться что к чему. Есть MySQL таблица категорий, из которой берутся некоторые значения для выпадающего списка, и всё это дело сортируется по полю Ordering. Тоесть вывод получается в том варианте, в котором всё было отсортированно в управлении категориями. Суть заключается в том, что надо сделать возможность выбора сортировки пользователем, тоесть чтобы он сам решал, как в списке будут отсортированны категории и субкатегории. Для этого из базы получаем массив в виде id, name, key и ordering, для всех записей. Поля key и ordering имеют свои значения для категорий и субкатегорий, в key указано 0 для категориии, а если это субкатегория, то указано id категории. Для сортировки по порядку, пойдёт таже функция что есть, а вот для сортировки по алфавиту, чтобы было без разницы в каком регистре первая буква, и чтобы также сортировалось в субкатегориях, вот эту функцию мне и надо. Может кто подскажет примером, как это реализовать, с учетом регистра и кирилицы и латиницы. Нужно чтобы это выглядело примерно так: Город - Красноярск - Ленинград - Москва - вerlin - Bremen Страна - Россия - Deutscland - France Auto - Жигули - запороже - BMW - Ford В общем, чтобы либо кирилица, либо латиница были первыми по списку для категорий и субкатегорий, и чтобы регистр не влиял. Я пробовал в имеющейся функции получения списка, с функцией sort(), но там сортировка по имени получается в порядке, сначало все с большой буквы, потом с маленькой, ну и сортировка субкатегорий не происходит, остаётся как для порядка. Заранее благодарен. |
| Автор: Sannis 14.6.2008, 12:47 |
| Используйте http://php.net/usort, сможете задать в функции сравнение приведение к одному регистру, чтобы это не влияло. Добавлено через 1 минуту и 32 секунды Да, если отсортировать эти элементы как один массив, а потом выводить по категориям, то оно и будет правильно отсортировано... Или вы хотите сразу получить список в порядке для вывода? |
| Автор: SergV 14.6.2008, 12:57 | ||||
Не важно, в каком порядке будет всё это сделано, важно чтобы результат был как в примере. Конечно, я думаю, что если получить список уже отсортированным прямо из базы, это будет лучше, но можно и отсортировать в пхп сразу. Щас найду ту функцию, что сортирует по порядку(ordering), может её можно будет переделать. -------------------------------------------------------------------------------------------------------------
я менял @$category_list .= "<option value='$category_id' "; на @$category_list .= "<option value='$category_name ";, и результат сортировки как писал выше, сначало с большой буквы, потом с маленькой, а субкатегории сортировка по ordering. Выборка из базы как order by name не влияет на сортировку, так как сортируется всё ниже в коде. |
| Автор: IZ@TOP 14.6.2008, 17:34 |
| SergV, а изменить сортировку списка при выборке из базы никак нельзя, если пользователь указал свой порядок? Или вообще, сделать это на JS, если у Вас весь список целиком размещается на странице. |
| Автор: SergV 15.6.2008, 11:57 |
| IZ@TOP, список выпадающий, плюс сортировка не просто всех данных по списку, а с разделением по категориям и их субкатегориям. Иными словами, если брать отсортированный список прям из базы, то это не одно обращение к базе а несколько, и чем больше список категорий и субкатегорий, тем больше обращений. Насчет ява скрипт, это можно и в ява скрипт конечно сделать, но если у пользователя ава скрипт отключен, то досвидания со списком. Потом, я ява скрипт не знаю, а пхп знаю в общих чертах, в подробности не углублялся, а что касается базы, так и вообще ток начинаю разбираться. Поэтому и прошу помощи, так как нет сейчас особо времени на углублённое изучение пхп и базы. Ладно..., я уже прикинул как это можно сделать, что нибуть придумаю, хотябы с учетом того, что все категории и субкатегории будут начинаться с большой буквы. |
| Автор: IZ@TOP 16.6.2008, 14:38 |
| SergV, в один запрос можно вполне уложиться. Сортируй по имени родителя, потом по имени. Могу пример при необходимости привести, если ты совсем новичок. |
| Автор: SergV 16.6.2008, 16:08 |
| IZ@TOP, пример лишний не помешает, я пока с циклами в пхп не разбирался, тут по другому чем в Delphi, а запросы к базам, так и вообще пока для меня новое, ток боле мене разобрался как просто получать все данные и выборочно. У меня пока нет времени на все тонкости, я веб дизайном занимаюсь, и пхп мне нужен в основном для этих целей, да для создания своих несложных модулей и компонентов на сайт. |
| Автор: IZ@TOP 16.6.2008, 17:10 | ||||||
| Вот небольшой пример. Таблица:
Соответственно, категории имеют parent_id равный нулю, вложенные - равным id родителя. Выборка:
Вывод:
Этот код верен для двумерной вложенности категорий. Для динамической вложенности подход будет чуть сложнее. |
| Автор: SergV 16.6.2008, 17:42 | ||
| IZ@TOP, Спасибо, хороший пример, попробую подстроить его в функцию, потом отпишусь что вышло. Есть только вопрос, если я правильно понял, то выборка происходит по ordering, а значить и сортировка будет по ordering? Или title ASC меняет сортировку и в список $categories получаем отсортированным по имени? Потом, не понял, для чего в цикле, в присаваивании переменной $categories[$row['parent_id']][] последние пустые квадратные скобки?
Это пока не стоит на повестке дня, главное получить двумерный список, и в алфавитном порядке. |
| Автор: SergV 17.6.2008, 13:34 |
| IZ@TOP, спасибо за помощь, твой пример думаю пригодится в будущем. Я уже элементарно решил эту проблему, взяв код такого же списка из функции в админке категории, и заменил им этот код, всё работает как надо. С дуру не мог сразу глянуть как в админке сделано, решил что там также, а там намного лучше даже в отношении построения дерева. В общем вопрос снимается. |