Сортировка многомерного массива по значению ключа в 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().
Ответов пока нет.
Войдите чтобы оставить ответ