我有一个完整的来自同一个类的对象的数组。我想通过可选对象字段对此数组进行排序,例如$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;
}
编辑凹凸
答案 0 :(得分:10)
您不仅可以使用匿名函数,还可以使用闭包,例如
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&lt; 5.3,您可以使用对象而不是匿名函数。
usort()期望第二个参数为callable
。从php 5.3开始,这可能是一个令人厌恶的函数,但它也可以是函数的名称....或者作为像array($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, ' ', $o->Sender, "\n";
}
}
function getData() {
return 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')
);
}
(如果你大量使用它 - 或者不想写这样的借口 - 你可能想要定义像interface Comparator { ... }
这样的接口,让Foo实现该接口并具有一些功能/ class使用Comparator,即usort()周围对象的包装器。)
答案 1 :(得分:7)
您可以将usort用作:
function cmp( $a, $b ) {
return ($a->ID - $b->ID); // assuming numeric ID
}
usort($arrayOfObjects,'cmp');
在PHP&gt; = 5.3中,您也可以使用匿名函数:
usort($arrayOfObjects, function($a, $b) {
return $a->ID - $b->ID;
});
答案 2 :(得分:0)
你必须写它,但usort()
:
function my_obj_sort($a, $b) {
return strnatcasecmp($a->Sender, $b->Sender);
}
usort($cases, 'my_obj_sort');
答案 3 :(得分:0)
你应该看看usort()函数。它接受一个自定义排序的回调,这就是你想要的。
答案 4 :(得分:0)
从设计POV中,更好的选择是使用专用对象(如CasesCollection)而不是普通数组。您可以使排序键成为此对象的成员,并在排序回调中将其简单地称为$this->sortKey
。