Сортировка многомерного массива по значению ключа в PHP
Использование функции usort() для пользовательской сортировки
Для сортировки многомерного массива по значению определённого ключа в PHP лучше всего подходит функция usort(). Она позволяет задать собственную логику сравнения элементов массива.
Вот как это работает:
$users = [
['name' => 'Иван', 'age' => 25],
['name' => 'Анна', 'age' => 18],
['name' => 'Пётр', 'age' => 30],
['name' => 'Мария', 'age' => 22]
];
usort($users, function($a, $b) {
return $a['age'] - $b['age'];
});
print_r($users);
Объяснение кода:
usort()принимает два аргумента: сам массив (передаётся по ссылке) и callback-функцию для сравнения.- Callback-функция сравнивает два элемента массива
$aи$b. - Она должна вернуть:
- Отрицательное число, если
$aменьше$b(должен быть раньше) - Ноль, если они равны
- Положительное число, если
$aбольше$b(должен быть позже)
- Отрицательное число, если
- Выражение
$a['age'] - $b['age']как раз даёт такой результат для числовых значений.
Сортировка по возрастанию и убыванию
Для сортировки по убыванию просто поменяйте порядок вычитания:
usort($users, function($a, $b) {
return $b['age'] - $a['age'];
});
Сортировка по строковым значениям
Если нужно сортировать по строке (например, по имени), используйте strcmp():
usort($users, function($a, $b) {
return strcmp($a['name'], $b['name']);
});
Сортировка с сохранением ключей (array_multisort)
Если вам нужно сохранить исходные ключи массива, используйте uasort() (аналог usort(), но с сохранением ключей):
$users = [
'user1' => ['name' => 'Иван', 'age' => 25],
'user2' => ['name' => 'Анна', 'age' => 18],
];
uasort($users, function($a, $b) {
return $a['age'] - $b['age'];
});
Сортировка по нескольким полям
Можно сортировать по двум и более полям. Например, сначала по возрасту, а если возраст одинаковый — по имени:
usort($users, function($a, $b) {
$ageCompare = $a['age'] - $b['age'];
if ($ageCompare !== 0) {
return $ageCompare;
}
return strcmp($a['name'], $b['name']);
});
Важно: Функция usort() изменяет исходный массив, так как он передаётся по ссылке. Если нужно сохранить оригинальный массив, создайте копию перед сортировкой.
Этот подход универсален и работает во всех версиях PHP. Он подходит для массивов любой вложенности и с любыми типами данных в сравниваемых полях.
<<Альтернативный подход: array_multisort()
Если вам нужно отсортировать несколько массивов одновременно или вы предпочитаете более декларативный стиль, можно использовать array_multisort().
$users = [
['name' => 'Иван', 'age' => 25],
['name' => 'Анна', 'age' => 18],
['name' => 'Пётр', 'age' => 30],
];
// Извлекаем столбец 'age' в отдельный массив
$ages = array_column($users, 'age');
// Сортируем $users по $ages
array_multisort($ages, SORT_ASC, $users);
print_r($users);
Преимущества этого подхода:
- Не нужно писать callback-функцию — код короче и читается как "извлеки столбец и отсортируй по нему".
- Можно легко сортировать по нескольким столбцам, передавая дополнительные массивы и флаги сортировки.
Недостатки:
- Менее гибкий, чем
usort()— нельзя написать сложную логику сравнения. - Требует дополнительного шага для извлечения столбца.
- Не работает напрямую с ассоциативными массивами, где ключи нужно сохранить (нужно использовать
array_multisort()с дополнительными параметрами).
Выбирайте этот вариант, если вам нужно просто отсортировать по одному числовому или строковому полю без сложной логики. Для более сложных случаев лучше использовать usort().