php. Сортировка массива по нескольким полям

Данный материал предоставлен сайтом PacificSky.Ru исключительно в ознакомительных целях. Администрация не несет ответственности за его содержимое.

Сортировка массива по нескольким полям/колонкам


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

В массиве категории и названия перемешаны в хаотичном порядке.

Для сортировки массива воспользуемся функцией usort.
Внутри функции usort, отсортируем массив по алфавиту, по категории "category" с сортировкой по алфавиту.
В случае, если категории сравниваемых элементов массива равны, то сравниваем по имени "name" и возвращаем направление сортировки в виде значений 1,-1 и 0.

usort($array, function ($a, $b) {
    if ($a['category'] === $b['category']) {
        if ($a['name'] < $b['name']) {
            return -1;
        }
        if ($a['name'] > $b['name']) {
            return 1;
        }
        if ($a['name'] <=> $b['name']) {
            return 0;
        }
    }

    if ($a['category'] < $b['category']) {
        return -1;
    }

    if ($a['category'] > $b['category']) {
        return 1;
    }
});


После выполнения функции usort массив $array будет выглядеть следующим образом:


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

Весь код из данного примера:


Начиная с версии php 7.0 появился оператор spaceship <=> (Космический корабль). С помощью данного оператора можно сократить длину кода в функции usort:

usort($array, function ($a, $b) {
    if ($a['category'] === $b['category']) {
        return $a['name'] <=> $b['name'];
    }

    if ($a['category'] < $b['category']) {
        return -1;
    }

    if ($a['category'] > $b['category']) {
        return 1;
    }
});
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.