Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка списка категорий, Отсортировать в алфавитном порядке 
:(
    Опции темы
SergV
Дата 14.6.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 4.8.2006
Где: Германия

Репутация: нет
Всего: 1



Вобщем нужна помощь, сам не успеваю разобраться что к чему.

Есть MySQL таблица категорий, из которой берутся некоторые значения для выпадающего списка, и всё это дело сортируется по полю Ordering. Тоесть вывод получается в том варианте, в котором всё было отсортированно в управлении категориями.

Суть заключается в том, что надо сделать возможность выбора сортировки пользователем, тоесть чтобы он сам решал, как в списке будут отсортированны категории и субкатегории.
Для этого из базы получаем массив в виде id, name, key и ordering, для всех записей. Поля key и ordering имеют свои значения для категорий и субкатегорий, в key указано 0 для категориии, а если это субкатегория, то указано id категории.
Для сортировки по порядку, пойдёт таже функция что есть, а вот для сортировки по алфавиту, чтобы было без разницы в каком регистре первая буква, и чтобы также сортировалось в субкатегориях, вот эту функцию мне и надо.

Может кто подскажет примером, как это реализовать, с учетом регистра и кирилицы и латиницы.

Нужно чтобы это выглядело примерно так:
Город
- Красноярск
- Ленинград
- Москва
- вerlin
- Bremen
Страна
- Россия
- Deutscland
- France
Auto
- Жигули
- запороже
- BMW
- Ford

В общем, чтобы либо кирилица, либо латиница были первыми по списку для категорий и субкатегорий, и чтобы регистр не влиял.
Я пробовал в имеющейся функции получения списка, с функцией sort(), но там сортировка по имени получается в порядке, сначало все с большой буквы, потом с маленькой, ну и сортировка субкатегорий не происходит, остаётся как для порядка.

Заранее благодарен.
PM   Вверх
Sannis
Дата 14.6.2008, 12:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

Репутация: 6
Всего: 13



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

Добавлено через 1 минуту и 32 секунды
Да, если отсортировать эти элементы как один массив, а потом выводить по категориям, то оно и будет правильно отсортировано... Или вы хотите сразу получить список в порядке для вывода?


--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
SergV
Дата 14.6.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 4.8.2006
Где: Германия

Репутация: нет
Всего: 1



Цитата

Да, если отсортировать эти элементы как один массив, а потом выводить по категориям, то оно и будет правильно отсортировано... Или вы хотите сразу получить список в порядке для вывода?

Не важно, в каком порядке будет всё это сделано, важно чтобы результат был как в примере. 
Конечно, я думаю, что если получить список уже отсортированным прямо из базы, это будет лучше, но можно и отсортировать в пхп сразу.

Щас найду ту функцию, что сортирует по порядку(ordering), может её можно будет переделать.

-------------------------------------------------------------------------------------------------------------

Код

    function ShowDropDownCategoryList ($cat, $cname="cat", $extra=null, $flag=0) {
        global $database, $ad_category, $my;
        $arr_cat = explode(",", $ad_category);
        $category = "<select name=\"$cname\" class=\"inputbox\" $extra>";
        if ($flag == 1) $add_category=true;
        if (@$add_category) {
            $category .= "<option value=0></option>";
        } else {
            $category .= "<option value='0'>"._DG_SUBCAT_SELECT."</option>"; 
        }
        $database->setQuery(" select * from #__datsogallery_catg where access<='".$my->gid."' and published='1' order by ordering ");
        $result = $database->query();
        $num_rows = mysql_num_rows($result);
        $i = 0;
        while ($i < $num_rows) {
            $category_id = mysql_result($result, $i, 'cid');
            $category_name = mysql_result($result, $i, 'name');
            if (in_array($category_id, $arr_cat)) {
                @$category_list .= "<option value='$category_id' ";
                if ($category_id == $cat) $category_list .= "selected";
                $category_list .= ">" . ShowCategoryPath($category_id) . "</option>\n"; 
            }
            $i++;
        }
        $categories = explode("\n", $category_list);
        asort($categories);
        $category .= implode("\n", $categories);
        $category .= "</select>";
        return $category;
    }



я менял @$category_list .= "<option value='$category_id' "; на @$category_list .= "<option value='$category_name ";, и результат сортировки как писал выше, сначало с большой буквы, потом с маленькой, а субкатегории сортировка по ordering.

Выборка из базы как order by name не влияет на сортировку, так как сортируется всё ниже в коде.

Это сообщение отредактировал(а) SergV - 14.6.2008, 13:07
PM   Вверх
IZ@TOP
Дата 14.6.2008, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



SergV, а изменить сортировку списка при выборке из базы никак нельзя, если пользователь указал свой порядок?
Или вообще, сделать это на JS, если у Вас весь список целиком размещается на странице.



--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
SergV
Дата 15.6.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 4.8.2006
Где: Германия

Репутация: нет
Всего: 1



IZ@TOP, список выпадающий, плюс сортировка не просто всех данных по списку, а с разделением по категориям и их субкатегориям. Иными словами, если брать отсортированный список прям из базы, то это не одно обращение к базе а несколько, и чем больше список категорий и субкатегорий, тем больше обращений.
Насчет ява скрипт, это можно и в ява скрипт конечно сделать, но если у пользователя ава скрипт отключен, то досвидания со списком. Потом, я ява скрипт не знаю, а пхп знаю в общих чертах, в подробности не углублялся, а что касается базы, так и вообще ток начинаю разбираться. Поэтому и прошу помощи, так как нет сейчас особо времени на углублённое изучение пхп и базы.

Ладно..., я уже прикинул как это можно сделать, что нибуть придумаю, хотябы с учетом того, что все категории и субкатегории будут начинаться с большой буквы.
PM   Вверх
IZ@TOP
Дата 16.6.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



SergV, в один запрос можно вполне уложиться. Сортируй по имени родителя, потом по имени.

Могу пример при необходимости привести, если ты совсем новичок.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
SergV
Дата 16.6.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 4.8.2006
Где: Германия

Репутация: нет
Всего: 1



IZ@TOP, пример лишний не помешает, я пока с циклами в пхп не разбирался, тут по другому чем в Delphi, а запросы к базам, так и вообще пока для меня новое, ток боле мене разобрался как просто получать все данные и выборочно. У меня пока нет времени на все тонкости, я веб дизайном занимаюсь, и пхп мне нужен в основном для этих целей, да для создания своих несложных модулей и компонентов на сайт.
PM   Вверх
IZ@TOP
Дата 16.6.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Вот небольшой пример.

Таблица:

Код

CREATE TABLE categories (
id int not null auto_increment,
parent_id not null default 0,
title varchar(255) not null,
ordering mediumint not null default 0,
PRIMARY KEY(id));


Соответственно, категории имеют parent_id равный нулю, вложенные - равным id родителя.

Выборка:

Код

$categories = array();
$result = mysql_query('SELECT * FROM categories ORDER BY ordering DESC, title ASC');
while($row = mysql_fetch_assoc($result)) {
     $categories[$row['parent_id']][] = $row;
}


Вывод:
Код

if(isset($categories[0])) {
  foreach($categories[0] as $category_root) {
    echo $category_root['title'] . "<br />";
    if(array_key_exists($category_root['id'], $categories)) {
       echo "Suncategories: <br />";
       foreach($categories[$category_root['id']] as $sub_category) {
         echo $sub_category['title'] . "<br />";
       } 
    }
  }
}


Этот код верен для двумерной вложенности категорий. 
Для динамической вложенности подход будет чуть сложнее.

Это сообщение отредактировал(а) IZ@TOP - 16.6.2008, 17:13


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
SergV
Дата 16.6.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 4.8.2006
Где: Германия

Репутация: нет
Всего: 1



IZ@TOP, Спасибо, хороший пример, попробую подстроить его в функцию, потом отпишусь что вышло.

Есть только вопрос, если я правильно понял, то выборка происходит по ordering, а значить и сортировка будет по ordering? Или title ASC меняет сортировку и в список $categories получаем отсортированным по имени?

Потом, не понял, для чего в цикле, в присаваивании переменной $categories[$row['parent_id']][] последние пустые квадратные скобки?

Цитата

Для динамической вложенности подход будет чуть сложнее.

Это пока не стоит на повестке дня, главное получить двумерный список, и в алфавитном порядке. smile
PM   Вверх
IZ@TOP
Дата 17.6.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Цитата(SergV @  16.6.2008,  18:42 Найти цитируемый пост)
Есть только вопрос, если я правильно понял, то выборка происходит по ordering, а значить и сортировка будет по ordering? Или title ASC меняет сортировку и в список $categories получаем отсортированным по имени?


Первая сортировка по ordering в порядке убывания, вторая сортировка по заголовку в порядке возрастания (т.е. по алфавиту). Соответственно, если у нес везде ordering 0 - сортировка в конечном счете будет исключительно по алфавиту. И, соответственно, ordering имеет больший приоритет по сортировке.
 
Цитата(SergV @  16.6.2008,  18:42 Найти цитируемый пост)
Потом, не понял, для чего в цикле, в присаваивании переменной $categories[$row['parent_id']][] последние пустые квадратные скобки?


Это необходимо для формирования категорий. Иначе у тебя для любого parent_id будет только одна запись потомка, а нам нужен список (массив).


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
SergV
Дата 17.6.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 4.8.2006
Где: Германия

Репутация: нет
Всего: 1



IZ@TOP, спасибо за помощь, твой пример думаю пригодится в будущем. 

Я уже элементарно решил эту проблему, взяв код такого же списка из функции в админке категории, и заменил им этот код, всё работает как надо. С дуру не мог сразу глянуть как в админке сделано, решил что там также, а там намного лучше даже в отношении построения дерева.

В общем вопрос снимается.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.