it-swarm.com.ru

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

Что такое элегантный способ сортировки объектов в PHP? Я хотел бы сделать что-то похожее на это.

$sortedObjectArary = sort($unsortedObjectArray, $Object->weight);

В основном укажите массив, который я хочу отсортировать, а также поле, по которому я хочу отсортировать. Я посмотрел на сортировку многомерных массивов, и там может быть что-то полезное, но я не вижу ничего элегантного или очевидного.

42
jW.

Почти дословно из руководства: 

function compare_weights($a, $b) { 
    if($a->weight == $b->weight) {
        return 0;
    } 
    return ($a->weight < $b->weight) ? -1 : 1;
} 

usort($unsortedObjectArray, 'compare_weights');

Если вы хотите, чтобы объекты могли сортировать сами, см. Пример 3 здесь: http://php.net/usort

73
Kent Fredric

Для php> = 5.3

function osort(&$array, $prop)
{
    usort($array, function($a, $b) use ($prop) {
        return $a->$prop > $b->$prop ? 1 : -1;
    }); 
}

Обратите внимание, что здесь используются анонимные функции/замыкания. Может быть полезно просмотреть документацию php по этому вопросу.

20
Will Shaver

Вы даже можете встроить поведение сортировки в класс, который вы сортируете, если вам нужен этот уровень контроля

class thingy
{
    public $prop1;
    public $prop2;

    static $sortKey;

    public function __construct( $prop1, $prop2 )
    {
        $this->prop1 = $prop1;
        $this->prop2 = $prop2;
    }

    public static function sorter( $a, $b )
    {
        return strcasecmp( $a->{self::$sortKey}, $b->{self::$sortKey} );
    }

    public static function sortByProp( &$collection, $prop )
    {
        self::$sortKey = $prop;
        usort( $collection, array( __CLASS__, 'sorter' ) );
    }

}

$thingies = array(
        new thingy( 'red', 'blue' )
    ,   new thingy( 'Apple', 'orange' )
    ,   new thingy( 'black', 'white' )
    ,   new thingy( 'democrat', 'republican' )
);

print_r( $thingies );

thingy::sortByProp( $thingies, 'prop1' );

print_r( $thingies );

thingy::sortByProp( $thingies, 'prop2' );

print_r( $thingies );
5
Peter Bailey

Для этой функции сравнения вы можете просто сделать:

function cmp( $a, $b )
{ 
    return $b->weight - $a->weight;
} 
4
Tom

Функция usort ( http://uk.php.net/manual/en/function.usort.php ) - ваш друг. Что-то вроде...

function objectWeightSort($lhs, $rhs)
{
   if ($lhs->weight == $rhs->weight)
     return 0;

   if ($lhs->weight > $rhs->weight)
     return 1;

   return -1;
}

usort($unsortedObjectArray, "objectWeightSort");

Обратите внимание, что любые ключи массива будут потеряны.

2
Adam Wright

Вы можете использовать функцию usort () и создать собственную функцию сравнения.

$sortedObjectArray = usort($unsortedObjectArray, 'sort_by_weight');

function sort_by_weight($a, $b) {
    if ($a->weight == $b->weight) {
        return 0;
    } else if ($a->weight < $b->weight) {
        return -1;
    } else {
        return 1;
    }
}
1
Jeremy Ruten
function PHPArrayObjectSorter($array,$sortBy,$direction='asc')
{
    $sortedArray=array();
    $tmpArray=array();
    foreach($this->$array as $obj)
    {
        $tmpArray[]=$obj->$sortBy;
    }
    if($direction=='asc'){
        asort($tmpArray);
    }else{
        arsort($tmpArray);
    }

    foreach($tmpArray as $k=>$tmp){
        $sortedArray[]=$array[$k];
    }

    return $sortedArray;

}

например

$myAscSortedArrayObject=PHPArrayObjectSorter($unsortedarray,$totalMarks,'asc');

$myDescSortedArrayObject=PHPArrayObjectSorter($unsortedarray,$totalMarks,'desc');
0
biswarupadhikari

В зависимости от проблемы, которую вы пытаетесь решить, вы также можете найти полезными интерфейсы SPL. Например, реализация интерфейса ArrayAccess позволит вам получить доступ к вашему классу как к массиву. Кроме того, реализация интерфейса SeekableIterator позволит вам перебирать ваш объект, как массив. Таким образом, вы можете отсортировать ваш объект так, как если бы он был простым массивом, имея полный контроль над значениями, которые он возвращает для данного ключа.

Больше подробностей:

0
Wilco

Вы можете иметь почти такой же код, как вы опубликовали с отсортировано функция из Nspl :

use function \nspl\a\sorted;
use function \nspl\op\propertyGetter;
use function \nspl\op\methodCaller;

// Sort by property value
$sortedByWeight = sorted($objects, propertyGetter('weight'));

// Or sort by result of method call
$sortedByWeight = sorted($objects, methodCaller('getWeight'));
0
Ihor Burlachenko