如何按对象的字段之一(例如name
或count
对这个对象数组进行排序? php
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 ) ....
这是使用闭包的更好方法 git
usort($your_data, function($a, $b) { return strcmp($a->name, $b->name); });
请注意,这不在PHP文档中,可是若是您使用5.3+闭包,则能够在其中提供可调用参数。 github
若是您使用的是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'));
若是须要基于本地的字符串比较,则能够使用strcoll
而不是strcmp
。 闭包
若是须要,请记住首先将setlocale
与LC_COLLATE
一块儿使用以设置语言环境信息。 ide
usort($your_data,function($a,$b){ setlocale (LC_COLLATE, 'pl_PL.UTF-8'); // Example of Polish language collation return strcoll($a->name,$b->name); });
若是在Codeigniter中使用此方法,则能够使用如下方法: oop
usort($jobs, array($this->job_model, "sortJobs")); // function inside Model usort($jobs, array($this, "sortJobs")); // Written inside Controller.
@rmooney谢谢您的建议。 真的对我有帮助。 this
若是您只须要按一个字段排序,那么usort
是一个不错的选择。 可是,若是您须要按多个字段进行排序,则解决方案很快就会变得混乱。 在这种状况下,能够使用YaLinqo库*, 该库为数组和对象实现相似于SQL的查询语法。 对于全部状况,它都有一个漂亮的语法: spa
$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()
以得到数组。 code
*由我开发