如何通过其中一个字段(如 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
)
....
18 回答
如果您只需要按一个字段排序,那么
usort
是一个不错的选择 . 但是,如果需要按多个字段排序,解决方案很快就会变得混乱 . 在这种情况下,可以使用YaLinqo library *,它为数组和对象实现类似SQL的查询语法 . 它具有适用于所有情况的漂亮语法:这里,
'$v->count'
是function ($v) { return $v->count; }
的简写(可以使用) . 这些方法链返回迭代器,但如果需要,可以通过添加->toArray()
来获取数组 .*由我开发
这就是我对实用程序类的看法
Call it:
继承人使用闭包更好的方式
请注意,这不在PHP的文档中,但如果您使用5.3闭包,则可以提供可调用的参数 .
如果需要基于本地的字符串比较,则可以使用strcoll而不是
strcmp
.记得首先使用setlocale和
LC_COLLATE
来设置区域设置信息(如果需要) .如果你想排序日期
您可以使用此功能(适用于PHP版本> = 5.3):
例:
如果一切都失败了,这是另一个解
如果您使用的是php oop,则可能需要更改为:
如果要排序整数值:
UPDATED 用字符串别忘了转换到同一个寄存器(上面或下面)
您可以使用
usort
,如下所示:最简单的方法是
将钥匙替换为您要订购的“钥匙”
count
字段将使用相同的代码 .有关
usort
的更多详细信息:http://ru2.php.net/usort顺便问一下,你从哪里得到那个阵列?我希望不是来自数据库?
一个简单的替代方案,允许您动态确定排序所基于的字段:
这基于Closure class,它允许匿名功能 . 从PHP 5.3开始提供 .
如果您在Codeigniter中使用它,您可以使用以下方法:
@rmooney谢谢你的建议 . 这对我很有帮助 .
感谢您的灵感,我还必须添加一个外部$ translator参数
您可以使用Nspl中的sorted函数:
使用usort,这是一个改编自手册的例子:
从评论中导入的编辑:
如果您正在从类内部对数组进行排序,并且您的排序函数
cmp
也在类中定义,那么使用:这里所有答案的缺点是他们使用 static 字段名称,所以我用OOP风格编写了一个调整后的版本 . 假设您使用的是getter方法,您可以直接使用此类并使用 field name as parameter . 可能有人发现它很有用 .