Сортировка массива по значению колонки в PHP: всё, что нужно знать

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Сортировка массива по значению колонки в PHP: гид для тех, кто устал гуглить

Вы когда-нибудь сталкивались с ситуацией, когда у вас есть список пользователей, товаров или заказов в виде массива ассоциативных массивов, и вам нужно отсортировать их по какому-то полю? Скажем, по возрасту, цене или дате регистрации. Если да — вы не одиноки. Этот вопрос на Stack Overflow собрал тысячи просмотров и десятки голосов. И сегодня мы разберём его раз и навсегда.

В этой статье мы не просто покажем, как работает usort и array_multisort. Мы ответим на самые частые вопросы, которые возникают у разработчиков: как сортировать по вложенному ключу, как сохранить ключи, как сортировать по нескольким полям, и что делать, если данные приходят из базы данных.

Поехали!

Что такое массив ассоциативных массивов и зачем его сортировать?

Представьте, что у вас есть список пользователей:

$users = [
    ['name' => 'Анна', 'age' => 25, 'city' => 'Москва'],
    ['name' => 'Борис', 'age' => 30, 'city' => 'Санкт-Петербург'],
    ['name' => 'Виктор', 'age' => 22, 'city' => 'Казань'],
];

Это типичный многомерный массив в PHP, где каждый элемент — ассоциативный массив с одинаковыми ключами. Часто нужно вывести такой список отсортированным по какому-то полю: по возрасту (от младшего к старшему), по имени (в алфавитном порядке) или по городу.

Стандартные функции PHP вроде sort() или asort() здесь не помогут — они работают с простыми значениями, а не с вложенными структурами. Нужны специальные инструменты.

Самый популярный способ: usort с анонимной функцией

Если вы зайдёте на Stack Overflow и откроете обсуждение "Sort an array of associative arrays by column value", то в 90% случаев вам посоветуют usort. Это логично: функция usort позволяет задать собственную логику сравнения двух элементов массива.

Как отсортировать массив по одному полю (возраст)

Допустим, мы хотим отсортировать наших пользователей по возрасту по возрастанию:

<?php
$users = [
    ['name' => 'Анна', 'age' => 25, 'city' => 'Москва'],
    ['name' => 'Борис', 'age' => 30, 'city' => 'Санкт-Петербург'],
    ['name' => 'Виктор', 'age' => 22, 'city' => 'Казань'],
];

usort($users, function($a, $b) {
    return $a['age'] <=> $b['age'];
});

print_r($users);
?>

Результат:

Array
(
    [0] => Array ( [name] => Виктор [age] => 22 [city] => Казань )
    [1] => Array ( [name] => Анна [age] => 25 [city] => Москва )
    [2] => Array ( [name] => Борис [age] => 30 [city] => Санкт-Петербург )
)

Обратите внимание: мы используем космический оператор <=> (spaceship), который появился в PHP 7. Он возвращает -1, 0 или 1, что идеально подходит для функций сортировки. Если нужно отсортировать по убыванию, просто поменяйте местами $a и $b:

usort($users, function($a, $b) {
    return $b['age'] <=> $a['age'];
});

Сортировка по строковому полю (имя)

Для строк всё так же просто. Хотите отсортировать пользователей по имени в алфавитном порядке? Пожалуйста:

usort($users, function($a, $b) {
    return strcmp($a['name'], $b['name']);
});

Или снова используем <=> — он работает и со строками:

usort($users, function($a, $b) {
    return $a['name'] <=> $b['name'];
});

Частые вопросы и подводные камни

1. Как отсортировать по вложенному ключу?

Иногда данные имеют более глубокую структуру. Например, у каждого пользователя есть массив profile с полем rating:

$users = [
    ['name' => 'Анна', 'profile' => ['rating' => 4.5]],
    ['name' => 'Борис', 'profile' => ['rating' => 3.8]],
    ['name' => 'Виктор', 'profile' => ['rating' => 4.9]],
];

Решение — просто обращайтесь к вложенному ключу внутри анонимной функции:

usort($users, function($a, $b) {
    return $a['profile']['rating'] <=> $b['profile']['rating'];
});

Работает без проблем. Главное — убедитесь, что ключ существует, иначе получите warning.

2. Как сохранить исходные ключи массива?

По умолчанию usort переиндексирует массив (сбрасывает числовые ключи). Если вам нужно сохранить ассоциативные ключи, используйте uasort — она работает так же, но сохраняет связь ключ => значение:

$users = [
    'user1' => ['name' => 'Анна', 'age' => 25],
    'user2' => ['name' => 'Борис', 'age' => 30],
    'user3' => ['name' => 'Виктор', 'age' => 22],
];

uasort($users, function($a, $b) {
    return $a['age'] <=> $b['age'];
});

print_r($users);
// Ключи 'user1', 'user2', 'user3' сохранятся

3. Как сортировать по нескольким полям?

Допустим, вы хотите отсортировать сначала по городу, а затем по возрасту внутри каждого города. Реализуется это просто: в функции сравнения сначала сравниваем по первому полю, если они равны — по второму:

usort($users, function($a, $b) {
    $cityCmp = strcmp($a['city'], $b['city']);
    if ($cityCmp !== 0)                

Блоги

Рекомендаций по книгам