PHP中的排序对象

PHP中的排序对象,php,arrays,sorting,Php,Arrays,Sorting,在PHP中,什么是对对象进行排序的优雅方式?我很想完成类似的事情 $sortedObjectArary = sort($unsortedObjectArray, $Object->weight); 基本上指定要排序的数组以及要排序的字段。我查看了多维数组排序,可能有一些有用的东西,但我没有看到任何优雅或明显的东西。手册中几乎一字不差的内容: function compare_weights($a, $b) { if($a->weight == $b->weight)

在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');
函数比较_权重($a,$b){
如果($a->重量==$b->重量){
返回0;
} 
返回($a->重量<$b->重量)?-1:1;
} 
usort($unsortedObjectArray,'compare_weights');
如果您希望对象能够自行排序,请参见示例3:

usort函数()是您的朋友。类似于

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

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

   return -1;
}

usort($unsortedObjectArray, "objectWeightSort");
请注意,任何数组键都将丢失。

您可以使用该函数并创建自己的比较函数

$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;
    }
}
$sortedObjectArray=usort($unsortedObjectArray,'sort_by_weight');
函数按权重排序($a,$b){
如果($a->重量==$b->重量){
返回0;
}否则如果($a->重量<$b->重量){
返回-1;
}否则{
返回1;
}
}

如果您想探索PHP中lambda风格函数的完整(可怕)范围,请参阅:

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

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

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

有关详细信息:

对于php>=5.3

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

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

对于该比较函数,您可以执行以下操作:

function cmp( $a, $b )
{ 
    return $b->weight - $a->weight;
} 
e、 g=>

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

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

您可以从以下位置获得与使用函数发布的代码几乎相同的代码:


@在我写这篇文章的时候,LoboPHP5已经4年了,现在已经是4年前了。我认为8年后,我们可以安全地把PHP4放在牧场上。如果
$a->$prop==$b->$prop
?第三个例子基本上是这样说的,“对不起,没有标准的方法让一个对象有一个比较器,只需在对象中编写一个
cmp\u obj
静态函数,记住用该函数调用usort。”好的,除了cmp_obj在PHP中没有特殊意义之外。如果PHP有Python的
\uu cmp\uuu
函数作为标准函数,或者Java的
实现了Comparable
接口,这样它就可以排序并使用
比较器,而无需深入挖掘该类实现所希望的排序。不幸的是,这在PHP7中似乎也没有改变。现在,这将使PHP变得合理和可用,我们不能这样做吗?:)不,我们不能,但我们确实需要另一种方法来在PHP7中表达相同的表达式,尽管这种方法很典型,窃取了一个perl特性,然后错误地实现了它哦为什么?为什么?为什么?
$myAscSortedArrayObject=PHPArrayObjectSorter($unsortedarray,$totalMarks,'asc');

$myDescSortedArrayObject=PHPArrayObjectSorter($unsortedarray,$totalMarks,'desc');
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'));