我有一个充满来自同一个类的对象的数组.我想通过可选对象字段对此数组进行排序,例如$case-> ID或$case-> Sender
是否有一个内置的array_sort()函数的味道,或者我必须自己写这个排序函数?
答案不必详细解释 – 这更像是/否问题
谢谢
我尝试失败的尝试失败了:
function sortBy($sort) { usort($this->abuseCases,function($a,$b) { if($a->{$sort} > $b->{$sort}) return 1; if($a->{$sort} < $b->{$sort}) return -1; else return 0; }); }
另一次尝试失败:
function sortBy($sort) { $this->sortBy = $sort; usort($this->abuseCases,array("this","srt")); } private function srt($a,$b) { if($a->{$this->sortBy} > $b->{$this->sortBy}) return 1; if($a->{$this->sortBy} < $b->{$this->sortBy}) return -1; else return 0; }
编辑凹凸
您不仅可以使用匿名函数,还可以使用闭包,例如
function ($a,$b) use ($sort) { ... }
和$sort将在函数体中可用.
自包含的例子:
<?PHP function getFn($sort) { return function($a,$b) use($sort) { if($a->$sort > $b->$sort) return 1; if($a->$sort < $b->$sort) return -1; return 0; }; } $abuseCases = array( (object)array('ID'=>1,'Sender'=>'Sender A'),(object)array('ID'=>3,'Sender'=>'Sender D'),(object)array('ID'=>2,'Sender'=>'Sender C'),(object)array('ID'=>4,'Sender'=>'Sender B') ); echo "\n----- Sort By Sender ----\n"; usort($abuseCases,getFn('Sender')); foo($abuseCases); echo "\n----- Sort By ID ----\n"; usort($abuseCases,getFn('ID')); foo($abuseCases); function foo($a) { foreach($a as $o) { echo $o->ID,' ',$o->Sender,"\n"; } }
版画
----- Sort By Sender ---- 1 Sender A 4 Sender B 2 Sender C 3 Sender D ----- Sort By ID ---- 1 Sender A 2 Sender C 3 Sender D 4 Sender B
更新:使用PHP< 5.3,您可以使用对象而不是匿名函数.
usort()期望第二个参数是可调用的.从PHP 5.3开始,这可能是一个令人厌恶的函数,但它也可以是函数的名称….或者作为数组传递的对象和方法名称,如数组($obj,’methodName’).
$abuseCases = getData(); echo "\n----- Sort By Sender ----\n"; usort($abuseCases,array(new Foo('Sender'),'compare')); foo($abuseCases); echo "\n----- Sort By ID ----\n"; usort($abuseCases,array(new Foo('ID'),'compare')); foo($abuseCases); class Foo { public $propName; // protected? public function __construct($propertyName) { $this->propName = $propertyName; } public function compare($a,$b) { $prop = $this->propName; if($a->$prop > $b->$prop) return 1; if($a->$prop < $b->$prop) return -1; return 0; } } function foo($a) { foreach($a as $o) { echo $o->ID,"\n"; } } function getData() { return array( (object)array('ID'=>1,'Sender'=>'Sender B') ); }
(如果你大量使用它 – 或者不想写这样的借口 – 你可能想要定义类似接口Comparator {…}的接口,让Foo实现该接口并具有一些功能/使用Comparator的类,即usort()周围对象的包装器.)