此问题旨在作为有关在 PHP 中排序数组的问题的参考。很容易认为您的特定案例是独一无二的并且值得提出一个新问题,但大多数实际上是此页面上解决方案之一的微小变化。
如果您的问题作为此问题的副本而关闭,请仅在您能解释为什么它与以下所有问题显着不同时才要求重新打开您的问题。
如何在 PHP 中对数组进行排序?
如何在 PHP 中对 复杂 数组进行排序?
如何在 PHP 中对对象数组进行排序?
有关使用 PHP 现有函数的实际答案,请参阅 1.,有关排序算法的学术详细答案(PHP 的函数实现以及您 可能 需要非常非常复杂的情况),请参阅 2。
原文由 deceze 发布,翻译遵循 CC BY-SA 4.0 许可协议
基本一维数组
适用的排序功能:
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
它们之间的区别仅在于是否保留键值关联(“
a
”函数),是从低到高排序还是反向排序(“r
”),是否它对值或键(“k
”)以及它如何比较值(“nat
”与正常)进行排序。请参阅 http://php.net/manual/en/array.sorting.php 以获取概述和更多详细信息的链接。多维数组,包括对象数组
如果要按每个条目的键 ‘foo’ 对
$array
进行排序,则需要 _自定义比较函数_。上述sort
和相关函数对他们知道如何比较和排序的简单值起作用。 PHP 并不简单地“知道”如何处理像array('foo' => 'bar', 'baz' => 42)
这样的 _复杂值_;所以你需要告诉它。为此,您需要创建一个 _比较函数_。该函数需要两个元素,并且必须返回
0
如果这些元素被认为相等,则返回值低于0
如果第一个值较低且值高于0
如果第一个值更高。这就是所有需要的:通常,您会希望使用 匿名函数 作为回调。如果要使用方法或静态方法,请参阅 PHP 中指定回调的其他方法。
然后,您可以使用以下功能之一:
usort
uasort
uksort
同样,它们仅在是否保持键值关联以及按值或键排序方面有所不同。阅读他们的文档以获取详细信息。
示例用法:
usort
将从数组中取出两个项目并调用您的cmp
函数。 Socmp()
will be called with$a
asarray('foo' => 'bar', 'baz' => 42)
and$b
as anotherarray('foo' => ..., 'baz' => ...)
.然后该函数返回到usort
哪个值更大或它们是否相等。usort
重复这个过程,为$a
和$b
传递不同的值,直到数组被排序。cmp
函数将被调用多次, 至少 与$array
中的值一样多,并且$b
$a
的值组合不同---
每次。要习惯这个想法,试试这个:
您所做的只是定义一种自定义方法来比较两个项目,这就是您所需要的。这适用于各种价值观。
顺便说一句,这适用于任何值,这些值不必是复杂的数组。如果您想进行自定义比较,也可以在简单的数字数组上进行。
sort
按引用排序,不返回任何有用的信息!请注意,数组 就地 排序,您不需要将返回值分配给任何东西。
$array = sort($array)
将用true
替换数组,而不是排序数组。只是sort($array);
有效。自定义数值比较
如果要按
baz
键(数字)排序,您需要做的就是:多亏了 The Power oF MATH ,这取决于
$a
是否低于、等于或大于$b
返回值 < 0、0 或 > 0。请注意,这不适用于
float
值,因为它们将减少为int
并失去精度。使用显式-1
,0
和1
返回值。对象
如果你有一个对象数组,它的工作方式相同:
功能
你可以在比较函数中做任何你需要的事情,包括调用函数:
字符串
第一个字符串比较版本的快捷方式:
strcmp
does exactly what’s expected ofcmp
here, it returns-1
,0
or1
.宇宙飞船操作员
PHP 7 引入了 spaceship 运算符,它统一并简化了等于/小于/大于跨类型的比较:
按多个字段排序
如果您想主要按
foo
排序,但如果foo
对两个元素相等,则按baz
排序:对于熟悉的人来说,这相当于使用
ORDER BY foo, baz
的 SQL 查询。另请参阅 这个非常简洁的速记版本 以及 如何为任意数量的键动态创建这样的比较函数。
排序成手动的静态顺序
如果要将元素排序为“手动顺序”,例如 “foo”、“bar”、“baz” :
对于上述所有情况,如果您使用的是 PHP 5.3 或更高版本(并且您确实应该),请使用匿名函数来缩短代码并避免出现另一个全局函数:
这就是对复杂的多维数组进行排序的简单程度。再一次,只考虑 教 PHP 如何分辨两个项目中的哪一个“更大” ;让 PHP 进行实际的排序。
同样对于上述所有内容,要在升序和降序之间切换,只需交换
$a
和$b
参数。例如:根据另一个数组对一个数组进行排序
然后是特殊的
array_multisort
,它可以让您根据另一个数组对一个数组进行排序:这里的预期结果是:
使用
array_multisort
到达那里:从 PHP 5.5.0 开始,您可以使用
array_column
从多维数组中提取一列并在该列上对数组进行排序:您还可以在任一方向上对多个列进行排序:
从 PHP 7.0.0 开始,您还可以从对象数组中提取属性。