Сортировка многомерного массива по значению

Решение задачи как отсортировать многомерный массив по значению, чтобы при этом сохранить все ключи элементов массива.

Сортировка многомерного массива по значению

  В 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'));

 

Записи по теме
Методы массивов JavaScript
массив Методы массивов в JavaScript и примеры их использования: push, pop, unshift, shift, split, join, slice, splice, reverse, map, filter, reduce, sort, includes ...
Сортировка числового массива
Сортировка числового массива Как правильно отсортировать массив из чисел в javascript. Готовое решение для сортировки данных в числовых массивах.

 

 

Комментарии 2
16:34 23.06.2020 #

Код работает отлично, но только он сортирует по возрастанию: 1, 2, 3, 4 ...

А мне нужно наоборот, отсортировать по убыванию: 9, 8, 7, 5, 4 ...

Второй день сижу над этой задачей. Можете помочь?

17:15 23.06.2020 #

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

return strnatcmp($a[$key], $b[$key]);

Вот две функции, в название функций добавил _ask и _desc чтобы различать их по порядку сортировки:

/**
 * Сортировка многомерного массива - по возрастанию
 */
function build_sorter_ask($key) {
    return function($a, $b) use ($key) {
        return strnatcmp($a[$key], $b[$key]);
    };
}

/**
 * Сортировка многомерного массива - по убыванию
 */
function build_sorter_desc($key) {
    return function($a, $b) use ($key) {
        return strnatcmp($b[$key], $a[$key]);
    };
}

Так функция build_sorter_ask сортирует по возрастанию, а функция build_sorter_desc по убыванию.

Теперь просто вызываем нужную нам функцию:

uasort($people, build_sorter_ask('order'));

или если нужно по убыванию:

uasort($people, build_sorter_desc('order'));

Аргументы в функции:

  • $people - многомерный массив который нужно отсортировать
  • order - ключ по значению которого сортируем элементы массива.

*** чтобы писать комментарии.