我是sorting an array of objects by object property使用此过程:
function cmp($a, $b)
{
return strcmp($a->name, $b->name);
}
usort($array_of_obj, "cmp"); //sorts array by object name
在我的例子中,object属性存储为变量$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参数。功能。如果这是一个死胡同的努力,或者如果有办法解决这个问题,我不确定我是否应该这样做。我该怎么办?
答案 0 :(得分: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);
});
答案 1 :(得分: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 );
}
当然,只有当它们是同一类的对象时,这才有效。
答案 2 :(得分: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 =============
// ===============================================