如何按对象的字段之一(例如name
或count
对这个对象数组进行排序?
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
)
....
#1楼
这是使用闭包的更好方法
usort($your_data, function($a, $b)
{
return strcmp($a->name, $b->name);
});
请注意,这不在PHP文档中,但是如果您使用5.3+闭包,则可以在其中提供可调用参数。
#2楼
如果您使用的是php oop,则可能需要更改为:
public static function cmp($a, $b)
{
return strcmp($a->name, $b->name);
}
//in this case FUNCTION_NAME would be cmp
usort($your_data, array('YOUR_CLASS_NAME','FUNCTION_NAME'));
#3楼
如果需要基于本地的字符串比较,则可以使用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);
});
#4楼
如果在Codeigniter中使用此方法,则可以使用以下方法:
usort($jobs, array($this->job_model, "sortJobs")); // function inside Model
usort($jobs, array($this, "sortJobs")); // Written inside Controller.
@rmooney谢谢您的建议。 真的对我有帮助。
#5楼
如果您只需要按一个字段排序,那么usort
是一个不错的选择。 但是,如果您需要按多个字段进行排序,则解决方案很快就会变得混乱。 在这种情况下,可以使用YaLinqo库*, 该库为数组和对象实现类似于SQL的查询语法。 对于所有情况,它都有一个漂亮的语法:
$sortedByName = from($objects)->orderBy('$v->name');
$sortedByCount = from($objects)->orderBy('$v->count');
$sortedByCountAndName = from($objects)->orderBy('$v->count')->thenBy('$v->name');
在这里, '$v->count'
是function ($v) { return $v->count; }
的简写。 function ($v) { return $v->count; }
function ($v) { return $v->count; }
(都可以使用)。 这些方法链返回迭代器,但是如果需要,可以在最后添加->toArray()
以获得数组。
*由我开发
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3159841