php - 按子数组中的多个值对 PHP 数组进行排序

标签 php arrays sorting usort

所以我不太确定标题是否最适合它,但数组如下所示:

array (
   [0] => array (
              [category] => 'Value_1'
              [date]     => '01/01/2011'
              [data]     => 'A'
          )
   [1] => array (
              [category] => 'Value_3'
              [date]     => '01/01/2000'
              [data]     => 'B'
          )
   [2] => array (
              [category] => 'Value_2'
              [date]     => '01/01/2011'
              [data]     => 'D'
          )
   [3] => array (
              [category] => 'Value_2'
              [date]     => '01/01/2010'
              [data]     => 'A'
          )
   [4] => array (
              [category] => 'Value_2'
              [date]     => '01/01/2011'
              [data]     => 'C'
          )
)

我希望如何对这些数据进行排序:

  1. 保留类别的顺序
  2. 在类别中,按日期 DESC 排序
  3. 如果日期出现多次,则按数据字母 ASC 排序

然后,示例数组将被排序为 array ([0], [1], [4], [2], [3]),更具体地说:

array (
   [0] => array (
              [category] => 'Value_1'
              [date]     => '01/01/2011'
              [data]     => 'A'
          )
   [1] => array (
              [category] => 'Value_3'
              [date]     => '01/01/2000'
              [data]     => 'B'
          )
   [2] => array (
              [category] => 'Value_2'
              [date]     => '01/01/2011'
              [data]     => 'C'
          )
   [3] => array (
              [category] => 'Value_2'
              [date]     => '01/01/2011'
              [data]     => 'D'
          )
   [4] => array (
              [category] => 'Value_2'
              [date]     => '01/01/2010'
              [data]     => 'A'
          )
)

我的问题是我知道我需要 usort 和/或 array_multisort(),但我不确定如何有效地迭代循环以便按照我给出的标准进行排序。

最佳答案

您的问题可以通过一个很好的比较函数和 uasort()usort() 轻松解决。其工作原理如下:

您的比较函数接受两个参数,它们是您排序的数组的元素。如果第一个参数应首先出现在排序数组中,则返回 -1;如果第二个参数应首先出现,则返回 1;如果两个参数在排序顺序上相等,则返回 0。

您的订单标准如下:按类别排序。如果类别相同,则按日期排序。如果日期相同,则按数据排序。

不幸的是,您的数组结构不正确。如果另一个category=Value_3 作为数组中的最后一个元素出现怎么办?它应该与其他 Value_3 条目分组,还是应该单独排序?根据这个答案,应该重组数组以便于排序。

另一个改进是日期的存储方式。美国日期格式完全无法用于排序,无论是作为字符串还是数值。将其转换为 unix 时间戳,或使用 ISO 日期格式“YYYY-MM-DD”。两者都可以轻松进行比较,无需多说。

关于php - 按子数组中的多个值对 PHP 数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7997823/

相关文章:

java - 按优先级对列表进行排序,然后反转具有相同优先级的元素的顺序

php - 根据键从多维数组中删除元素

C++ 段错误 std::array

java - 如何按升序对链表进行排序

c++ - 类问题中的静态 int 数组

jQuery/Ajax : How to loop through array as part of Ajax success function

android - 使用数组适配器对 ListView 进行排序

javascript - 社交网络分享按钮设置为基于分享数量和社交网络数量的基于百分比的高度?

php - 日期未在控制台中显示为字符串

php - 自动提示显示空白 li