Сортировка многомерных массивов — распространённая задача, для которой PHP предлагает несколько эффективных подходов. Рассмотрим основные методы с примерами.
Лучший выбор для сложных условий сортировки. Использует 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'];
});
Позволяет сортировать по нескольким полям одновременно.
<?php
// Получаем массивы значений для сортировки
$ages = array_column($users, 'age');
$names = array_column($users, 'name');
// Сначала по возрасту, затем по имени
array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);
Если важно сохранить ассоциативные ключи:
<?php
uasort($users, function($a, $b) {
return $a['age'] <=> $b['age'];
});
Когда нужно отсортировать сам массив по его ключам:
<?php
$data = [
'user3' => ['age' => 25],
'user1' => ['age' => 32],
'user2' => ['age' => 28]
];
uksort($data, function($a, $b) {
return strcmp($a, $b);
});
Для частого использования удобно создать специализированные функции:
<?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');
Аналогичные методы работают и для массивов объектов:
<?php
class User {
public $name;
public $age;
}
$users = [/* массив объектов User */];
usort($users, function($a, $b) {
return $a->age <=> $b->age;
});
array_multisort()
обычно быстрееusort()
более гибкая, но требует больше ресурсовusort()
с оператором <=>array_multisort()
uasort()
или uksort()