所以我不太确定标题是否最适合它,但数组如下所示:
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'
)
)
我希望如何对这些数据进行排序:
- 保留类别的顺序
- 在类别中,按日期 DESC 排序
- 如果日期出现多次,则按数据字母 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/