按照变量对象属性排序对象数组

3

我正在使用以下方法通过对象属性对对象数组进行排序:在这里

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

usort($array_of_obj, "cmp"); //sorts array by object name

在我的情况下,对象属性存储在变量$prop中,这样我就可以选择要排序的属性(名称、日期等)。因此,我想要像这样的东西:
function cmp($a, $b, $prop)  
{
    return strcmp($a->$prop, $b->$prop);
}

$prop = 'someproperty';
usort($array_of_obj, "cmp");  //sorts array by chosen object property, $prop

我遇到的问题是在调用"cmp"函数时无法将值传递给$prop参数。我不确定是否应该这样做,如果这是一个死路,还是有一些方法可以解决。我应该怎么办?


usort文档中的示例#4似乎是沿着这些线路做某事。 - Patrick Q
3个回答

3

您可以将调用封装在匿名函数中

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

$prop = 'someproperty';
usort($array_of_obj, function($a,$b) use ($prop) { 
    return cmp($a,$b,$prop); 
});

EDIT: Explanation of the keyword 'use'


2
那很流畅。 - Ray

1
你可以在 $a$b 所属的类或共同父类中添加一个静态属性。你可以将其命名为“sort_property”,然后使用它:
   //Set the sort property 
   Class_of_a_and_b::$sort_property = 'name';

   //call sort
   usort($array_of_obj, "cmp");

   //....stuff ...

   function cmp($a, $b)
   {
         //in real code, maybe test if the sort property is valid...
         $sort_prop = Class_of_a_and_b::$sort_property;
         return strcmp($a->$sort_prop , $b->$sort_prop );
   }

当然,这只适用于它们是同一类对象的情况。

我喜欢这个想法!而且我认为它会奏效...不过得用另一个 :) - brietsparks
@bsapaka,是的,闭包更加优雅。 - Ray

0

只是一個想法

// ===============================================
// Start => Sort Object / Array by Key ===========
// ===============================================
function usort_array($array, $key, $order = 'asc') {
    if(strtolower($order) == 'asc')
        usort($array, function($a, $b) use ($key) { return strcmp($a[$key], $b[$key]); });
    else
        usort($array, function($a, $b) use ($key) { return strcmp($b[$key], $a[$key]); });
    return $array;
}

function usort_object($object, $key, $order = 'asc') {
    if(strtolower($order) == 'asc')
        usort($object, function($a, $b) use ($key) { return strcmp($a->$key, $b->$key); });
    else
        usort($object, function($a, $b) use ($key) { return strcmp($b->$key, $a->$key); });
    return $object;
}
// ===============================================
// End => Sort Object / Array by Key =============
// ===============================================

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接