Предположим у нас есть несортированный список пользователей (имя, возраст):
Иван, 34;
Валера, 17;
Елена, 34;
Иван, 35;
Иван, 37;
Иван, 36;
Антон, 10.
И предположим этих пользователей нужно отсортировать по именам. Используя оператор <=>, получим следующее:
Антон, 10;
Валера, 17;
Елена, 34;
Иван, 34;
Иван, 35;
Иван, 37;
Иван, 36.
PHP-функция для этой сортировки будет выглядеть так:
public function sortBy($property)
{
usort($this->users, function($userOne, $userTwo) use ($property) {
return $userOne->$property() <=> $userTwo->$property();
});
}
$property – это имя пользователя. Сортировку наоборот можно произвести поменяв $userOne->$property() и $userTwo->$property() местами. Если вы заметили, то у нас есть несколько Иванов и их тоже можно отсортировать между собой по возрасту. PHP-функция для такой сортировки будет выглядеть так:
public function sortByTwo($propertyOne, $propertyTwo)
{
usort($this->users, function($userOne, $userTwo) use ($propertyOne, $propertyTwo) {
return $userOne->$propertyOne() <=> $userTwo->$propertyOne()?:
$userOne->$propertyTwo() <=> $userTwo->$propertyTwo();
});
}
Полный рабочий пример с двумя функциями:
class User {
protected $name;
protected $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
public function name()
{
return $this->name;
}
public function age()
{
return $this->age;
}
}
class UserCollection {
protected $users;
public function __construct(array $users)
{
$this->users = $users;
}
public function users()
{
return $this->users;
}
public function sortBy($property)
{
usort($this->users, function($userOne, $userTwo) use ($property) {
return $userOne->$property() <=> $userTwo->$property();
});
}
public function sortByTwo($propertyOne, $propertyTwo)
{
usort($this->users, function($userOne, $userTwo) use ($propertyOne, $propertyTwo) {
return $userOne->$propertyOne() <=> $userTwo->$propertyOne()?:
$userOne->$propertyTwo() <=> $userTwo->$propertyTwo();
});
}
}
$collection = new UserCollection([
new User('Иван', 34),
new User('Валера', 17),
new User('Елена', 34),
new User('Иван', 35),
new User('Иван', 37),
new User('Иван', 36),
new User('Антон', 10)
]);
//$collection->sortBy('name');
$collection->sortByTwo('name', 'age');
var_dump($collection->users());