44

什么是在 PHP 中对对象进行排序的优雅方法?我很想完成类似的事情。

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

基本上指定我想要排序的数组以及我想要排序的字段。我研究了多维数组排序,那里可能有一些有用的东西,但我没有看到任何优雅或明显的东西。

4

11 回答 11

73

手册中几乎逐字记录:

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

于 2008-09-23T22:20:54.770 回答
20

对于 php >= 5.3

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

请注意,这使用匿名函数/闭包。可能会发现查看 php 文档很有用。

于 2009-08-24T00:07:27.230 回答
5

如果您想要那种级别的控制,您甚至可以将排序行为构建到您正在排序的类中

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 );
于 2008-09-23T23:01:14.000 回答
4

对于该比较功能,您可以这样做:

function cmp( $a, $b )
{ 
    return $b->weight - $a->weight;
} 
于 2011-01-05T20:13:45.107 回答
2

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

请注意,任何数组键都将丢失。

于 2008-09-23T22:22:03.207 回答
1

您可以使用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;
    }
}
于 2008-09-23T22:22:31.193 回答
1

从 2022 年开始更新 - 对对象数组进行排序:

usort($array, fn(object $a, object $b): int => $a->weight <=> $b->weight);

完整示例:

$array = [
    (object) ['weight' =>  5],
    (object) ['weight' => 10],
    (object) ['weight' =>  1],
];

usort($array, fn(object $a, object $b): int => $a->weight <=> $b->weight);
// Now, $array is sorted by objects' weight.

// display example :
echo json_encode($array);

输出:

[{"weight":1},{"weight":5},{"weight":10}]

文档链接:

于 2022-02-20T16:41:50.740 回答
0

根据您尝试解决的问题,您可能还会发现 SPL 接口很有用。例如,实现 ArrayAccess 接口将允许您像访问数组一样访问您的类。此外,实现 SeekableIterator 接口可以让您像数组一样循环遍历对象。通过这种方式,您可以对对象进行排序,就好像它是一个简单的数组一样,可以完全控制它为给定键返回的值。

更多细节:

于 2008-09-24T02:22:58.680 回答
0
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');
于 2012-06-12T00:26:53.893 回答
0

您可以使用Nspl中的sorted函数发布几乎相同的代码:

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'));
于 2016-02-24T20:42:42.960 回答
-3

如果您想探索 PHP 中 lambda 样式函数的完整(可怕)范围,请参阅: http ://docs.php.net/manual/en/function.create-function.php

于 2008-09-23T22:27:34.050 回答