Для кого-то эта статья покажется тривиальной, но новички могут открыть для себя что-то новое. В любом случае, советую почитать.
Иногда бывает нужно сделать сортировку списка по значению какого-то поля из этого списка. Поясню. Например, у вас есть список дел, каждое дело в списке помечено приоритетом. Бывают приоритеты (самый приоритетный, приоритетный, средний приоритет, низкий приоритет и самый низкий приоритет).
Давайте посмотрим это на примере таблицы mysql. Создадим таблицу:
CREATE TABLE `tasks` (
`id` INT NOT NULL AUTO_INCREMENT ,
`priority` ENUM( 'highest', 'hight', 'medium', 'low', 'lowest' ) NOT NULL ,
`title` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
);
и добавим в нее данные:
INSERT INTO `tasks` VALUES (1, 'medium', 'Выгулять собаку');
INSERT INTO `tasks` VALUES (2, 'lowest', 'Полить кактус');
INSERT INTO `tasks` VALUES (3, 'medium', 'Сходить в магазин');
INSERT INTO `tasks` VALUES (4, 'highest', 'Захватить мир');
INSERT INTO `tasks` VALUES (5, 'low', 'Прочитать Ремарка');
INSERT INTO `tasks` VALUES (6, 'hight', 'Прыгнуть с парашютом');
INSERT INTO `tasks` VALUES (7, 'medium', 'Поспать');
Сортировка выборки из таблицы mysql по-значению
Теперь давайте напишем запрос, который выведет нам записи из таблицы от самого высокого приоритета (он будет сверху), до самого низкого (соответственно, он будет в самом низу):
SELECT * FROM `tasks` ORDER BY FIELD(`priority`, 'highest', 'hight', 'medium', 'low', 'lowest')
В итоге, мы получим такой список:
| id | priority | title |
|---|---|---|
| 4 | highest | Захватить мир |
| 6 | hight | Прыгнуть с парашютом |
| 7 | medium | Поспать |
| 1 | medium | Выгулять собаку |
| 3 | medium | Сходить в магазин |
| 5 | low | Прочитать Ремарка |
| 2 | lowest | Полить кактус |
Таким способом, как этот, можно легко сделать функциональность “прикрепленные темы” в форуме - те темы, которые находятся всегда наверху в списке тем.
Сортировка массивов php по значению
Теперь представим, что у нас есть те же данные, что и в вышеприведенной таблице mysql, но теперь в виде php-массива. Нам требуется отсортировать этот массив так же, как и выборку из таблицы. Посмотрим, как выглядит сам массив:
$tasks = array(
array(
'id' => 1,
'priority' => 'medium',
'title' => 'Выгулять собаку'
),
array(
'id' => 2,
'priority' => 'lowest',
'title' => 'Полить кактус'
),
array(
'id' => 3,
'priority' => 'medium',
'title' => 'Сходить в магазин'
),
array(
'id' => 4,
'priority' => 'highest',
'title' => 'Захватить мир'
),
array(
'id' => 5,
'priority' => 'low',
'title' => 'Прочитать Ремарка'
),
array(
'id' => 6,
'priority' => 'hight',
'title' => 'Прыгнуть с парашютом'
),
array(
'id' => 7,
'priority' => 'medium',
'title' => 'Поспать'
)
);
Теперь посмотрим на код, сортирующий массив. Главная фишка находится в функции-коллбэке - там мы задаем порядок, в котором будут сортироваться записи.
uasort($tasks, 'sort_by_value');
print_r($tasks);
function sort_by_value($a, $b) {
// Определяем порядок сортировки
$order = array(
'highest' => 1,
'hight' => 2,
'medium' => 3,
'low' => 4,
'lowest' => 5
);
if ($order[ $a['priority'] ] == $order[ $b['priority'] ]) {
return 0;
}
return ($order[ $a['priority'] ] < $order[ $b['priority'] ]) ? -1 : 1;
}
После того, как код отработает, мы получим отсортированный массив:
Array
(
[3] => Array
(
[id] => 4
[priority] => highest
[title] => Захватить мир
)
[5] => Array
(
[id] => 6
[priority] => hight
[title] => Прыгнуть с парашютом
)
[6] => Array
(
[id] => 7
[priority] => medium
[title] => Поспать
)
[0] => Array
(
[id] => 1
[priority] => medium
[title] => Выгулять собаку
)
[2] => Array
(
[id] => 3
[priority] => medium
[title] => Сходить в магазин
)
[4] => Array
(
[id] => 5
[priority] => low
[title] => Прочитать Ремарка
)
[1] => Array
(
[id] => 2
[priority] => lowest
[title] => Полить кактус
)
)
Надеюсь, кто-нибудь узнал что-то новое для себя :)
Буду рад комментариям.
Also interesting
Tags: mysql, php, сортировка
1. Перечисляемые поля это хорошо . Но ихмо они нечасто подходят =)
2. Сортировать методом пузырька хорошо - но есть ещё куча алгоритмов =)
(Надо купить книжку по ним , недавно видел книжку Вирта в 10000 книг , отпугнуло слово паскаль)
Спасибо за информацию, перая часть очень помогла.