Avatar ·

Как отсортировать двумерный массив по значению одного из столбцов в PHP?

Всем привет! Я новичок в PHP и столкнулся с задачей, которая поставила меня в тупик. У меня есть двумерный массив (многомерный), который содержит данные о пользователях. Вот пример: ```php $users = [ ['name' => 'Иван', 'age' => 25, 'salary' => 50000], ['name' => 'Мария', 'age' => 30, 'salary' => 60000], ['name' => 'Петр', 'age' => 22, 'salary' => 45000], ['name' => 'Анна', 'age' => 28, 'salary' => 55000] ]; ``` Мне нужно отсортировать этот массив по возрасту (`age`) в порядке возрастания, чтобы сначала шли самые молодые пользователи. Я пробовал использовать `sort()`, `asort()` и `ksort()`, но они работают только с одномерными массивами и просто перемешивают строки или ключи, не сортируя по внутреннему полю. Я также читал про `array_multisort()`, но не понял, как его применить к моей структуре. Может быть, есть какой-то простой способ? Нужен практический пример с пояснениями, потому что я хочу не просто скопировать код, а понять, как это работает. Заранее спасибо за помощь! Буду благодарен за любой совет, даже если это будет ссылка на документацию, но с объяснением на пальцах. <<>>

Решение с помощью 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, что увеличивает потребление памяти.