Сортировка массива объектов по одному свойству в PHP
Использование функции usort() для сортировки массива объектов
Для сортировки массива объектов в PHP по одному свойству лучше всего подходит функция usort(). Она принимает массив и callback-функцию, которая сравнивает два элемента и возвращает отрицательное число, ноль или положительное число в зависимости от того, какой элемент должен идти раньше.
Простой пример: сортировка по возрасту
В вашем случае нужно отсортировать массив объектов User по свойству age. Вот как это делается:
<?php
class User {
public $name;
public $age;
public $score;
public function __construct($name, $age, $score) {
$this->name = $name;
$this->age = $age;
$this->score = $score;
}
}
$users = [
new User('Alice', 25, 90),
new User('Bob', 30, 85),
new User('Charlie', 22, 95),
new User('Diana', 28, 88)
];
// Сортировка по возрасту (по возрастанию)
usort($users, function($a, $b) {
return $a->age <=> $b->age;
});
// Вывод результата
foreach ($users as $user) {
echo "{$user->name}: {$user->age} лет, очки: {$user->score}\n";
}
?>
Как это работает
- Callback-функция принимает два элемента массива (
$aи$b) и сравнивает их. - Оператор
<=>(космический корабль) сравнивает два значения и возвращает:- -1, если
$a->age < $b->age(левое меньше правого) - 0, если они равны
- 1, если
$a->age > $b->age(левое больше правого)
- -1, если
- Функция
usort()использует эти значения для сортировки массива по возрастанию.
Сортировка по убыванию
Чтобы отсортировать по убыванию, просто поменяйте местами $a и $b в сравнении:
usort($users, function($a, $b) {
return $b->age <=> $a->age; // по убыванию
});
Сортировка по строковым свойствам
Если нужно сортировать по строке (например, по имени), используйте strcmp() или оператор <=>:
usort($users, function($a, $b) {
return strcmp($a->name, $b->name); // по алфавиту
});
Использование стрелочных функций (PHP 7.4+)
В современных версиях PHP можно использовать более лаконичный синтаксис:
usort($users, fn($a, $b) => $a->age <=> $b->age);
Важные замечания
- usort() изменяет исходный массив — она сортирует его на месте и не возвращает новый массив.
- Если нужно сохранить исходный порядок, сделайте копию массива перед сортировкой:
$sortedUsers = $users; usort($sortedUsers, ...);. - Для более сложной сортировки (по нескольким полям) можно использовать вложенные условия в callback-функции.
Теперь вы можете легко сортировать массивы объектов по любому свойству! Удачи в изучении PHP!
<<Альтернативный подход: использование функций array_multisort() и array_column()
Если вы предпочитаете не писать callback-функции, можно использовать комбинацию array_multisort() и array_column(). Этот метод особенно удобен, когда нужно отсортировать массив по одному свойству, а callback кажется слишком сложным.
<?php
// Исходный массив объектов
$users = [
new User('Alice', 25, 90),
new User('Bob', 30, 85),
new User('Charlie', 22, 95),
new User('Diana', 28, 88)
];
// Извлекаем значения возраста в отдельный массив
$ages = array_column($users, 'age');
// Сортируем основной массив по возрастанию на основе $ages
array_multisort($ages, SORT_ASC, $users);
// Вывод результата
foreach ($users as $user) {
echo "{$user->name}: {$user->age} лет, очки: {$user->score}\n";
}
?>
Как это работает
array_column($users, 'age')создает новый массив, содержащий только значения свойстваageиз каждого объекта.array_multisort()сортирует массив$agesи одновременно переставляет элементы в$usersв том же порядке.- Преимущество: не нужно писать callback-функцию, код более декларативный.
- Недостаток: создается дополнительный массив, что может быть менее эффективно для больших объемов данных.
Этот метод хорошо подходит для простых случаев, когда нужно сортировать по одному свойству. Для более сложной сортировки (например, по нескольким полям или с пользовательской логикой) лучше использовать usort().