Сортировка объектов в PHP 7

Добавлено: 03/09/2016 23:54 |  Обновлено: 19/08/2017 11:42 |  Добавил: nick |  Просмотры: 5853 Комментарии: 0
Вводная часть
В материале описывается сортировка объектов с использованием нового в PHP 7 оператора «космический корабль» <=> (Spaceship operator).
Предположим у нас есть несортированный список пользователей (имя, возраст):
Иван, 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());

Оставьте свой комментарий

Комментариев нет