Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

Для php >= 5.3

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

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

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

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 );

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

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

Функция usort ( 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");

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

Вы могли бы использовать 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;
    }
}

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

Для получения более подробной информации:

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');

У вас может быть почти тот же код, который вы опубликовали с помощью отсортирован функция из 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'));

Если вы хотите изучить полный (ужасающий) масштаб функций в стиле лямбда в PHP, смотрите:http://docs.php.net/manual/en/function.create-function.php

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top