Особенно, если getName () занимает много времени, вам лучше использовать шаблон decorate-sort-undecorate .
<?php
class Person {
private $name;
function getName() {
return $this->name;
}
function __construct($name) {
$this->name = $name;
}
}
$people = array(
new Person('Jim'),
new Person('Tom'),
new Person('Tim'),
new Person('Adam')
);
// actual sorting below
$people = array_map(create_function('$a', 'return array($a->getName(), $a);'), $people); // transform array of objects into array of arrays consisted of sort key and object
sort($people); // sort array of arrays
$people = array_map('end', $people); // take only last element from each array
print_r($people);
Как это работает?
Вместо сортировки массива объектов вы сортируете массив массивов, последним элементом которых является объект, а первым - ключ, по которому вы хотите отсортировать. После сортировки вы сохраняете только объект.
Вы можете использовать только sort
для сортировки массивов массивов, поскольку PHP сравнивает два массива одинаковой длины, сравнивая его элементы один за другим.
Сортировка по нескольким полям
Вы можете использовать более одного ключа сортировки, например, сортировать по фамилии, и если фамилии идентичны, учитывайте имя. Вы можете сделать это, украсив несколько ключей в порядке важности, например:
$people = array_map(create_function('$a', 'return array($a->getSurname(), $a->getName(), $a);'), $people);
Почему это быстро
Этот способ может быть быстрее, чем при использовании usort
, поскольку он вызывает getName () только n раз для сортировки массива длины n. Сравнения во время сортировки выполняются с использованием встроенного компаратора, поэтому должны быть быстрыми. В usort
метод пользовательского компаратора вызывается несколько раз (более n раз) во время сортировки, и это может привести к замедлению работы.