Сортировка многомерного массива по значению
В php более десятка различных методов для сортировки массивов. Но невсегда с помощью только метода можно решить задачу сортировки. Вот одна из таких задач.
Допустим у нас есть вот такой многомерный php-массив с одинаковыми по структуре элементами
'people' => [
'qwerty' => [
'name' => 'Иванов',
'active' => true,
'order' => 3
],
'ytrewq' => [
'name' => 'Петров',
'active' => false,
'order' => 1
],
'asdfgh' => [
'name' => 'Сидоров',
'active' => true,
'order' => 2
]
];
У каждого из элементов массива есть параметр order
по которому собственно и нужно отсортировать элементы массива. При этом ключи элементов массива должны сохраниться.
Для решения задачи воспользуемся методом uasort()
в сочетании с вот такой небольшой функцией:
$people = ['people'];
function build_sorter($key) {
return function($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}
uasort($people, build_sorter('order'));
Код работает отлично, но только он сортирует по возрастанию: 1, 2, 3, 4 ...
А мне нужно наоборот, отсортировать по убыванию: 9, 8, 7, 5, 4 ...
Второй день сижу над этой задачей. Можете помочь?
Чтобы отсортировать этот многомерный массив по ключам по убыванию, достаточно в месте сравнения поменять аргументы местами. Вот эта строка:
return strnatcmp($a[$key], $b[$key]);
Вот две функции, в название функций добавил
_ask
и_desc
чтобы различать их по порядку сортировки:Так функция
build_sorter_ask
сортирует по возрастанию, а функцияbuild_sorter_desc
по убыванию.Теперь просто вызываем нужную нам функцию:
или если нужно по убыванию:
Аргументы в функции:
$people
- многомерный массив который нужно отсортироватьorder
- ключ по значению которого сортируем элементы массива.*** Войдите чтобы писать комментарии.