基本一维数组
$array = array(3, 5, 2, 8);
适用的排序功能:
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
它们之间的区别仅仅是键值关联是否被保留(“”函数),它是否从低到高或反向排序(“”),它是否对值或键进行排序(“”)以及如何比较值(“”与正常)。有关概述和指向更多详细信息的链接,请参阅 http://php.net/manual/en/array.sorting.php。a
r
k
nat
多维数组,包括对象数组
$array = array(
array('foo' => 'bar', 'baz' => 42),
array('foo' => ..., 'baz' => ...),
...
);
如果要按每个条目的键“foo”排序,则需要自定义比较功能。上述函数和相关函数处理它们知道如何比较和排序的简单值。PHP不会简单地“知道”如何处理一个复杂的值,就像这样;所以你需要告诉它。$array
sort
array('foo' => 'bar', 'baz' => 42)
为此,您需要创建一个比较函数。该函数采用两个元素,如果认为这些元素相等,则必须返回,一个值低于第一个值时的值,另一个值高于第一个值较高时的值。这就是所有需要的:0
0
0
function cmp(array $a, array $b) {
if ($a['foo'] < $b['foo']) {
return -1;
} else if ($a['foo'] > $b['foo']) {
return 1;
} else {
return 0;
}
}
通常,您需要使用匿名函数作为回调。如果要使用方法或静态方法,请参阅在 PHP 中指定回调的其他方法。
然后,您可以使用以下函数之一:
同样,它们仅在于它们是保持键值关联并按值还是按键排序。有关详细信息,请阅读他们的文档。
用法示例:
usort($array, 'cmp');
usort
将从数组中获取两个项目,并使用它们调用函数。因此,将调用 as 和 as 另一个 .然后,该函数返回到哪个值较大或它们是否相等。 重复此过程,为数组传递不同的值,直到对数组进行排序。该函数将被调用多次,至少与 中的值一样多次调用,并且每次都有不同的值组合。cmp
cmp()
$a
array('foo' => 'bar', 'baz' => 42)
$b
array('foo' => ..., 'baz' => ...)
usort
usort
$a
$b
cmp
$array
$a
$b
要习惯这个想法,请尝试以下操作:
function cmp($a, $b) {
echo 'cmp called with $a:', PHP_EOL;
var_dump($a);
echo 'and $b:', PHP_EOL;
var_dump($b);
}
您所做的就是定义一种自定义方法来比较两个项目,这就是您所需要的。这适用于各种值。
顺便说一句,这适用于任何值,值不必是复杂的数组。如果您有想要进行的自定义比较,也可以对简单的数字数组进行比较。
sort
按引用排序,不返回任何有用的东西!
请注意,数组排序到位,您不需要将返回值分配给任何内容。 将数组替换为 ,而不是排序的数组。只是工作。$array = sort($array)
true
sort($array);
自定义数值比较
如果要按键(即数字)进行排序,您需要做的就是:baz
function cmp(array $a, array $b) {
return $a['baz'] - $b['baz'];
}
多亏了PoWEr oF MATH,它返回一个值<0,0或>0,具体取决于是否小于,等于或大于。$a
$b
请注意,这不适用于值,因为它们将被简化为 a 并失去精度。请改用显式 和返回值。float
int
-1
0
1
对象
如果你有一个对象数组,它的工作方式相同:
function cmp($a, $b) {
return $a->baz - $b->baz;
}
功能
您可以在比较函数中执行任何需要执行的操作,包括调用函数:
function cmp(array $a, array $b) {
return someFunction($a['baz']) - someFunction($b['baz']);
}
字符串
第一个字符串比较版本的快捷方式:
function cmp(array $a, array $b) {
return strcmp($a['foo'], $b['foo']);
}
strcmp
完全符合此处的预期,它将返回 ,或 。cmp
-1
0
1
宇宙飞船操作员
PHP 7 引入了宇宙飞船运算符,它统一并简化了相等/小于/大于类型之间的比较:
function cmp(array $a, array $b) {
return $a['foo'] <=> $b['foo'];
}
按多个字段排序
如果要主要按 排序,但如果对于排序方式为两个元素相等,则排序方式为:foo
foo
baz
function cmp(array $a, array $b) {
if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
return $cmp;
} else {
return $a['baz'] - $b['baz'];
}
}
对于那些熟悉的人来说,这相当于一个带有 的 SQL 查询。
另请参阅这个非常整洁的速记版本,以及如何为任意数量的键动态创建这样的比较函数。ORDER BY foo, baz
按手动静态顺序分类
如果要将元素排序为“手动顺序”,如“foo”,“bar”,“baz”:
function cmp(array $a, array $b) {
static $order = array('foo', 'bar', 'baz');
return array_search($a['foo'], $order) - array_search($b['foo'], $order);
}
对于上述所有内容,如果您使用的是 PHP 5.3 或更高版本(您确实应该这样做),请使用匿名函数来编写较短的代码,并避免有另一个全局函数浮动:
usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });
这就是对复杂的多维数组进行排序的简单程度。同样,只要想想教PHP如何分辨两个项目中哪一个是“更大”的;让PHP进行实际的排序。
同样对于上述所有内容,要在升序和降序之间切换,只需交换和参数即可。例如:$a
$b
return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
根据一个数组对另一个数组进行排序
然后是一个特殊的array_multisort
,它允许您根据一个数组对另一个数组进行排序:
$array1 = array( 4, 6, 1);
$array2 = array('a', 'b', 'c');
此处的预期结果将是:
$array2 = array('c', 'a', 'b'); // the sorted order of $array1
用于到达那里:array_multisort
array_multisort($array1, $array2);
从 PHP 5.5.0 开始,您可以使用从多维数组中提取列,并对该列上的数组进行排序:array_column
array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
您还可以在任一方向上对多个列进行排序:
array_multisort(array_column($array, 'foo'), SORT_DESC,
array_column($array, 'bar'), SORT_ASC,
$array);
从 PHP 7.0.0 开始,您还可以从对象数组中提取属性。
如果您有更常见的情况,请随时编辑此答案。