Sıralama PHP Nesne

8 Cevap php

PHP nesneleri sıralamak için zarif bir yolu nedir? Ben buna benzer bir şey başarmak isterim.

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

Temelde yanı sıra ben sıralamak istiyorum alanı sıralamak istediğiniz dizi belirtin. Ben çok boyutlu dizi sıralama içine baktı ve orada yararlı bir şey olabilir, ama zarif ya da belirgin bir şey görmüyorum.

8 Cevap

Kılavuzda neredeyse kelimesi kelimesine:

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

usort($unsortedObjectArray, 'compare_weights');

http://php.net/usort: Eğer nesneler kendilerini sıralamak mümkün istiyorsanız, örneğin 3 buraya bakın

Php> = 5.3 için

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

Bu Anonim işlevler / kapanışları kullandığını unutmayın. Bu yararlı üzerinde php dokümanlar gözden bulabilirsiniz.

Eğer kontrol o düzeyde istiyorsanız bile, sıralama konum sınıfa sıralama davranışını inşa edebilirsiniz

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

Bu işlevi karşılaştırmak için, sadece yapabilirsiniz:

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

Usort function (http://uk.php.net/manual/en/function.usort.php) senin arkadaşın. Gibi bir şey ...

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

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

   return -1;
}

usort($unsortedObjectArray, "objectWeightSort");

Herhangi Dizi anahtarları kayıp olacağını unutmayın.

Sen usort() işlevini kullanmak ve kendi karşılaştırma işlevi yapabilir.

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

Çözmeye çalıştığınız soruna bağlı olarak, aynı zamanda SPL arayüzleri yararlı olabilir. Örneğin, ArrayAccess arabirimini uygulayan bir dizi gibi sınıf erişmek için izin verecek. Ayrıca, SeekableIterator arabirimini uygulayan sadece bir dizi gibi nesnesi aracılığıyla size döngü izin istiyorum. Bunun belirli bir anahtar verir değerleri üzerinde tam kontrole sahip, basit bir dizi vardı gibi eğer sizin nesnesi sıralamak olabilir bu şekilde.

Daha ayrıntılı bilgi için:

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;

}

örneğin =>

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

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