web-dev-qa-db-de.com

Objekt sortieren in PHP

Was ist eine elegante Art, Objekte in PHP zu sortieren? Ich würde gerne etwas Ähnliches erreichen.

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

Geben Sie grundsätzlich das Array an, das ich sortieren möchte, sowie das Feld, nach dem Sie sortieren möchten. Ich habe mir die multidimensionale Array-Sortierung angesehen und es könnte etwas Nützliches dabei sein, aber ich sehe nichts elegantes oder offensichtliches.

42
jW.

Fast wörtlich aus dem Handbuch: 

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

usort($unsortedObjectArray, 'compare_weights');

Wenn Sie möchten, dass Objekte sich selbst sortieren können, sehen Sie sich Beispiel 3 hier an: http://php.net/usort

73
Kent Fredric

Für php> = 5,3

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

Beachten Sie, dass hierbei anonyme Funktionen/Schließungen verwendet werden. Vielleicht finden Sie die PHP-Dokumente zu diesem nützlichen.

20
Will Shaver

Sie können sogar das Sortierverhalten in die Klasse einbauen, die Sie sortieren, wenn Sie diese Kontrollebene möchten

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

Für diese Vergleichsfunktion können Sie einfach Folgendes tun:

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

Die Usort-Funktion ( http://uk.php.net/manual/de/function.usort.php ) ist Ihr Freund. So etwas wie...

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

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

   return -1;
}

usort($unsortedObjectArray, "objectWeightSort");

Beachten Sie, dass alle Array-Schlüssel verloren gehen.

2
Adam Wright

Sie können die Funktion usort () verwenden und Ihre eigene Vergleichsfunktion erstellen.

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

}

z.B. =>

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

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

Abhängig von dem Problem, das Sie lösen möchten, finden Sie möglicherweise auch die SPL-Schnittstellen hilfreich. Durch die Implementierung der ArrayAccess-Schnittstelle können Sie beispielsweise wie ein Array auf Ihre Klasse zugreifen. Durch die Implementierung der SeekableIterator-Schnittstelle können Sie Ihr Objekt wie ein Array durchlaufen. Auf diese Weise können Sie Ihr Objekt so sortieren, als wäre es ein einfaches Array, das die vollständige Kontrolle über die Werte hat, die es für einen bestimmten Schlüssel zurückgibt.

Für mehr Details:

0
Wilco

Sie können fast denselben Code haben, den Sie mit sortiert Funktion aus Nspl gebucht haben:

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