我如何排序这个对象数组的一个字段,如名称或计数?
Array
(
[0] => stdClass Object
(
[ID] => 1
[name] => Mary Jane
[count] => 420
)
[1] => stdClass Object
(
[ID] => 2
[name] => Johnny
[count] => 234
)
[2] => stdClass Object
(
[ID] => 3
[name] => Kathy
[count] => 4354
)
....
如果需要基于本地的字符串比较,可以使用strcoll而不是strcmp。
记住,如果需要,首先使用setlocale和LC_COLLATE来设置区域信息。
usort($your_data,function($a,$b){
setlocale (LC_COLLATE, 'pl_PL.UTF-8'); // Example of Polish language collation
return strcoll($a->name,$b->name);
});
使用usort,这里有一个从手册改编的例子:
function cmp($a, $b) {
return strcmp($a->name, $b->name);
}
usort($your_data, "cmp");
你也可以使用任何可调用对象作为第二个参数。下面是一些例子:
使用匿名函数(来自PHP 5.3)
作用(your_data美元,函数(a, b)美元{返回比较字符串(a - >名称、b美元- >名称);});
从类内部
Usort ($your_data, array($this, "cmp"));// "cmp"应该是类中的一个方法
使用箭头函数(来自PHP 7.4)
作用your_data美元,fn (a, b)美元= > strcmp (a - >名称、b美元- >名称));
同样,如果你比较数值,fn($a, $b) => $a->count - $b->count作为“比较”函数应该可以做到这一点,或者,如果你想用另一种方式做同样的事情,从PHP 7开始,你可以使用太空船操作符,像这样:fn($a, $b) => $a->count <=> $b->count。
这里所有答案的缺点是它们使用静态字段名,所以我写了一个OOP风格的调整版本。假设您正在使用getter方法,您可以直接使用这个类并使用字段名作为参数。也许有人会觉得它有用。
class CustomSort{
public $field = '';
public function cmp($a, $b)
{
/**
* field for order is in a class variable $field
* using getter function with naming convention getVariable() we set first letter to uppercase
* we use variable variable names - $a->{'varName'} would directly access a field
*/
return strcmp($a->{'get'.ucfirst($this->field)}(), $b->{'get'.ucfirst($this->field)}());
}
public function sortObjectArrayByField($array, $field)
{
$this->field = $field;
usort($array, array("Your\Namespace\CustomSort", "cmp"));;
return $array;
}
}