Frage

Was ist eine elegante Art und Weise Objekte in PHP zu sortieren? Ich würde gerne etwas ähnliches wie dies zu erreichen.

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

Im Grunde das Array angeben I als auch das Feld ich sortieren möchten sortieren möchten. Ich sah in mehrdimensionales Array sortieren und es könnte etwas Nützliches da sein, aber ich habe nichts elegant oder offensichtlich sehen.

War es hilfreich?

Lösung

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 Objekte wollen in der Lage sein, sich selbst zu sortieren, siehe Beispiel 3 hier: http://php.net/usort

Andere Tipps

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 diese verwendet Anonyme Funktionen / Verschlüsse. finden könnte die PHP-Dokumente auf, die nützlich zu überprüfen.

Sie können sogar das Sortierverhalten in der Klasse bauen Sie sortieren, wenn Sie das Niveau der Kontrolle wollen

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

Für die Funktion vergleichen, kann man einfach tun:

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

Die usort Funktion ( http://uk.php.net/manual /en/function.usort.php ) ist dein 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 Array-Schlüssel verloren.

könnten Sie verwenden die usort () Funktion und eigene Vergleichsfunktion machen.

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

Je nach Problem, das Sie versuchen zu lösen, können Sie auch die SPL-Schnittstellen nützlich finden. Zum Beispiel würde erlauben, die Arrayaccess-Schnittstelle implementieren Sie Ihre Klasse wie ein Array zuzugreifen. Auch würde die SeekableIterator Schnittstelle implementieren können Sie eine Schleife durch das Objekt genau wie ein Array. So können Sie Ihre Objekt sortieren könnte, als ob es sich um ein einfaches Array waren, die volle Kontrolle über die Werte, die sie für einen bestimmten Schlüssel zurück.

Weitere Informationen:

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 =>

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

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

Sie können fast den gleichen Code haben, wie Sie mit sortiert Funktion von 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'));

Wenn Sie die volle (erschreckend) Ausmaß der Lambda-Stil-Funktionen in PHP erkunden möchten, finden Sie unter: http://docs.php.net/manual/en/function. create-function.php

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top