Как отсортировать многомерный массив?php-29

Сортировка многомерных массивов — распространённая задача, для которой PHP предлагает несколько эффективных подходов. Рассмотрим основные методы с примерами.

1. usort — Пользовательская сортировка

Лучший выбор для сложных условий сортировки. Использует callback-функцию для сравнения элементов.

<?php
$users = [
    ['name' => 'Иван', 'age' => 32],
    ['name' => 'Пётр', 'age' => 25],
    ['name' => 'Анна', 'age' => 28]
];

// Сортировка по возрасту (по возрастанию)
usort($users, function($a, $b) {
    return $a['age'] <=> $b['age'];
});

// Сортировка по имени (по убыванию)
usort($users, function($a, $b) {
    return $b['name'] <=> $a['name'];
});

2. array_multisort — Многокритериальная сортировка

Позволяет сортировать по нескольким полям одновременно.

<?php
// Получаем массивы значений для сортировки
$ages = array_column($users, 'age');
$names = array_column($users, 'name');

// Сначала по возрасту, затем по имени
array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);

3. Сортировка с сохранением ключей

Если важно сохранить ассоциативные ключи:

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

4. Сортировка по ключам массива

Когда нужно отсортировать сам массив по его ключам:

<?php
$data = [
    'user3' => ['age' => 25],
    'user1' => ['age' => 32],
    'user2' => ['age' => 28]
];

uksort($data, function($a, $b) {
    return strcmp($a, $b);
});

5. Создание кастомных функций сортировки

Для частого использования удобно создать специализированные функции:

<?php
function sortByAgeAsc($a, $b) {
    return $a['age'] <=> $b['age'];
}

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

usort($users, 'sortByAgeAsc');
usort($users, 'sortByNameDesc');

6. Сортировка объектов

Аналогичные методы работают и для массивов объектов:

<?php
class User {
    public $name;
    public $age;
}

$users = [/* массив объектов User */];

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

Производительность

  • Для небольших массивов (до 100 элементов) разница незначительна
  • Для больших данных array_multisort() обычно быстрее
  • usort() более гибкая, но требует больше ресурсов

Резюмируем:

  • Для простой сортировки по одному полю используйте usort() с оператором <=>
  • Для сложной сортировки по нескольким полям — array_multisort()
  • Для сохранения ключей применяйте uasort() или uksort()
  • Создавайте кастомные функции для часто используемых сортировок