Сортировка по значению массивов и выборок из БД

Для кого-то эта статья покажется тривиальной, но новички могут открыть для себя что-то новое. В любом случае, советую почитать.

Иногда бывает нужно сделать сортировку списка по значению какого-то поля из этого списка. Поясню. Например, у вас есть список дел, каждое дело в списке помечено приоритетом. Бывают приоритеты (самый приоритетный, приоритетный, средний приоритет, низкий приоритет и самый низкий приоритет).

Давайте посмотрим это на примере таблицы 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: , ,

2 Responses to “Сортировка по значению массивов и выборок из БД”

  1. Saint_Byte says:

    1. Перечисляемые поля это хорошо . Но ихмо они нечасто подходят =)
    2. Сортировать методом пузырька хорошо - но есть ещё куча алгоритмов =)
    (Надо купить книжку по ним , недавно видел книжку Вирта в 10000 книг , отпугнуло слово паскаль)

  2. Тарас says:

    Спасибо за информацию, перая часть очень помогла.

Leave a Reply