【问题标题】:Best Way To Sort Multidimensional Array in PHP在 PHP 中对多维数组进行排序的最佳方法
【发布时间】:2016-01-22 10:54:28
【问题描述】:

我有这个数组:

$order_list = array ( array ("081", "01203", "2", "12000"),
                      array ("002", "01204", "8", NULL),
                      array ("021", "01207", "8", NULL),
                      array ("081", "01206", "8", NULL),
                      array ("043", "01205", "10", "14000"));         

我想根据第一个值(081、002、021、081 和 043)对该数组进行排序(升序)。所以它看起来像这样:

array ( array ("002", "01204", "8", NULL),
        array ("021", "01207", "8", NULL),
        array ("043", "01205", "10", "14000"),
        array ("081", "01203", "2", "12000"),
        array ("081", "01206", "8", NULL));

怎么做?我了解了asort()ksort(),但似乎只适用于关联数组,不适用于多维数组。

【问题讨论】:

  • 了解usort()
  • 查看本页“右侧”的相关栏...有很多非常有用的问题和答案。另外,搜索Google:php sort multi array
  • 这是一个重复的问题(以及任何答案):) 它必须是这里最受欢迎的问题之一。

标签: php arrays sorting multidimensional-array


【解决方案1】:

您可以使用usort()

usort($yourArray, function ($a, $b) {
    if ($a[0] == $b[0]) return 0;
    return (int) $a[0] < (int) $b[0] ? -1 : 1;
});

参数$a$b 是您的(子)数组。这个简单的函数比较每一个中的第一个值。

如果您的数组中没有数字,您可以使用strcmp()

usort($yourArray, function ($a, $b) {
    return strcmp($a[0], $b[0]);
});

【讨论】:

  • 如果您的排序函数返回0,请注意usort 显示undefined behavior(该链接中的第一个注意)。
  • @morido,你让它看起来比现在更糟。它只是说明无法判断是否返回了值 0,然后 usort 无法判断两者中的哪一个(在这种情况下为数组)先出现,这很好,因为它们被认为是相等的。
  • 我只是说它是怎么回事。毕竟,它是(很难找到)错误的美丽来源。因此,我更喜欢始终使行为具有确定性,并强制$a$b 首先排序,而不是将其留给实现。
  • @morido 那么为两个相同的数组确定 -1 或 1 的“正确”方法是什么?
  • 重点是,PHP 没有对相等元素的顺序做出任何声明。这与其他语言不同,在这种情况下,此类操作通常可以保证 稳定性(即可预测的行为)。例如,请参阅 Java 中的 Arrays.sort
【解决方案2】:

这样重写比较容易:

usort($order_list, function($v1, $v2) { return $v1[0] - $v2[0]; });

或者用sorted函数从Nspl对数组进行排序非常方便:

use function \nspl\a\sorted;
use function \nspl\op\itemGetter;

$sortedOrders = sorted($order_list, itemGetter(0));

【讨论】:

  • return $a - $b很好的接触
  • 我刚刚尝试了如果您省略了也可以正常工作的铸件(int) 会发生什么。所以你可以做return $v1[0] - $v2[0];
  • 不错的发现。由于- 没有为字符串定义,PHP 会自动将值转换为数字。更新答案。
猜你喜欢
  • 2014-09-16
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
相关资源
最近更新 更多