如何在PHP中对数组和数据进行排序?

降低

该问题旨在作为有关PHP中数组排序问题的参考。容易想到您的特定案例是独特的,值得提出新的问题,但是实际上大多数都是此页面上一种解决方案的细微变化。

如果您的问题作为该问题的副本被关闭,请仅在您可以解释为什么该问题与以下所有内容明显不同时才要求重新提出您的问题。

如何在PHP中对数组排序?
如何在PHP中复杂数组进行排序
如何在PHP中对对象数组进行排序?


  1. 基本的一维数组;含税 多维数组,包括 对象数组;含税 根据另一数组对一个数组进行排序

  2. 用SPL排序

  3. 稳定排序

有关使用PHP现有功能的实用答案,请参见1 .;有关排序算法的学术详细答案(PHP函数实现的,以及对于真正非常复杂的情况可能需要的答案),请参见2。

降低

基本的一维数组

$array = array(3, 5, 2, 8);

适用的排序功能:

  • sort
  • rsort
  • asort
  • arsort
  • natsort
  • natcasesort
  • ksort
  • krsort

两者之间的区别仅在于是否保留键值关联(“ a”功能),是否从低到高或反向r排序(“ ”),对值或键进行排序(“ k”)以及如何比较值(“ nat”与正常)。有关概述以及指向更多详细信息的链接,请参见http://php.net/manual/zh-CN/array.sorting.php

多维数组,包括对象数组

$array = array(
    array('foo' => 'bar', 'baz' => 42),
    array('foo' => ...,   'baz' => ...),
    ...
);

如果要按$array每个条目的键'foo'进行排序,则需要一个自定义比较函数上面sort和相关的函数处理简单的值,他们知道如何比较和排序。PHP不会简单地“知道”如何处理复杂的值,例如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将从数组中取出两项,并cmp用它们调用函数。因此cmp()将被称为$aasarray('foo' => 'bar', 'baz' => 42)$bas as 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'];
}

多亏了数学运算的功率,它返回的值$a小于,等于0还是大于0,具体取决于是小于,等于还是大于$b

请注意,这不适用于float值,因为它们会降低为int并失去精度。使用显式-101返回值。

对象

如果您有一个对象数组,则其工作方式相同:

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在这里,它返回-101

飞船操作员

PHP 7引入了spaceship运算符,该运算符统一并简化了与跨类型比较相比相等/较小/​​较大的操作:

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开始,您还可以从对象数组中提取属性。


如果您遇到更常见的情况,请随时编辑此答案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Java中对数组进行排序并跟踪索引

如何在Ruby中按降序对数组进行排序

如何在javascript中对数组进行排序?

如何在BigQuery标准SQL中对数组进行排序?

如何在php中使用数组对数据进行排序?

如何在JavaScript中按日期对数组进行排序?

如何在Swift 4中对数组日期进行排序

如何在Laravel中对数组的值进行排序

如何在Laravel 5.7中对数组进行排序

如何在PHP中使用If对数组进行排序

如何用名称,日期和数量对数组进行排序?的PHP

如何在C ++中对数组进行排序和检查?

如何在Ruby中对数组进行排序

如何在PHP的“ zig-zag”中对数组列表进行排序?

如何在C中对数字数组进行排序

如何在Swift中对数组进行排序?

如何在重复一些数据的php数组中对数据进行排序和分组?

如何在iOS的降序排列中对数组进行排序?

如何在Java中对数组类型列表进行排序?

如何在python中对数组进行排序?

如何使用PHP按键值对数组数据进行排序?

如何在 swift 4 中对数组中的 JSON 数据进行排序

如何在javascript中对数据数组进行分组和排序?

如何在 ReactJs 中对数组数据进行排序

如何在Javascript中按属性对数组进行排序

如何对数据表的同一数组中的字符串和数字进行排序

如何在 Python 中对数组数字进行排序

如何在python中对数组的JSON对象进行排序?

如何在 Ruby 中对数组进行排序