Как отсортировать двумерный массив по значению одного из столбцов в PHP?
Решение с помощью usort() — самый гибкий и понятный способ
Для сортировки двумерного массива по значению одного из столбцов в PHP лучше всего использовать функцию usort(). Она позволяет задать собственную функцию сравнения, которая будет определять порядок элементов. Это идеально подходит для твоей задачи.
Вот как это работает на практике:
<?php
$users = [
['name' => 'Иван', 'age' => 25, 'salary' => 50000],
['name' => 'Мария', 'age' => 30, 'salary' => 60000],
['name' => 'Петр', 'age' => 22, 'salary' => 45000],
['name' => 'Анна', 'age' => 28, 'salary' => 55000]
];
// Сортируем по возрасту (age) в порядке возрастания
usort($users, function($a, $b) {
return $a['age'] <=> $b['age'];
});
print_r($users);
?>
Результат:
Array
(
[0] => Array ([name] => Петр, [age] => 22, [salary] => 45000)
[1] => Array ([name] => Иван, [age] => 25, [salary] => 50000)
[2] => Array ([name] => Анна, [age] => 28, [salary] => 55000)
[3] => Array ([name] => Мария, [age] => 30, [salary] => 60000)
)
Как это работает?
usort($array, $callback)— сортирует массив, используя пользовательскую функцию сравнения.- Функция сравнения принимает два элемента массива (
$aи$b) и должна вернуть:- отрицательное число, если
$aдолжен быть перед$b; - положительное число, если
$aдолжен быть после$b; - 0, если они равны.
- отрицательное число, если
- Оператор «космический корабль» (
<=>) делает именно это: сравнивает два значения и возвращает -1, 0 или 1. Это сокращает код и делает его читаемым.
Сортировка по убыванию
Если нужно отсортировать по убыванию (от старших к младшим), просто поменяй местами $a и $b:
usort($users, function($a, $b) {
return $b['age'] <=> $a['age'];
});
Сортировка по строковому полю (например, по имени)
Работает точно так же, но для строк используй strcmp() или оператор <=> (он тоже работает со строками):
usort($users, function($a, $b) {
return strcmp($a['name'], $b['name']);
});
// или
usort($users, function($a, $b) {
return $a['name'] <=> $b['name'];
});
Важные замечания
usort()изменяет исходный массив (сортирует по ссылке), поэтому не нужно присваивать результат.- Если нужно сохранить ключи (ассоциативные индексы), используй
uasort()— она работает так же, но сохраняет связь ключ => значение. - Для очень больших массивов (сотни тысяч элементов)
usort()может быть медленнее встроенных алгоритмов, но для 99% задач это идеальный выбор.
Этот подход считается «золотым стандартом» в PHP для сортировки двумерных массивов. Он гибкий, понятный и легко адаптируется под любые условия.
<<Альтернатива: array_multisort() для сортировки по одному столбцу
Если тебе не нравится писать анонимные функции, можно использовать array_multisort() в комбинации с array_column().
<?php
$users = [
['name' => 'Иван', 'age' => 25, 'salary' => 50000],
['name' => 'Мария', 'age' => 30, 'salary' => 60000],
['name' => 'Петр', 'age' => 22, 'salary' => 45000],
['name' => 'Анна', 'age' => 28, 'salary' => 55000]
];
// Извлекаем столбец 'age' в отдельный массив
$ages = array_column($users, 'age');
// Сортируем $users по значениям из $ages
array_multisort($ages, SORT_ASC, $users);
print_r($users);
?>
Этот метод тоже работает, но он менее гибкий: если нужно сортировать по сложному условию (например, по длине имени или по комбинации полей), usort() будет проще. Однако для простой сортировки по одному числовому или строковому столбцу это вполне рабочий вариант. Минус — создаётся дополнительный массив $ages, что увеличивает потребление памяти.