【问题标题】:Sorting array with date as key with usort使用 usort 以日期为键对数组进行排序
【发布时间】:2017-09-14 16:52:49
【问题描述】:

我有一个数组,它的键是日期,我想按升序排序。我尝试使用 ksort() 和其他没有成功的排序方法对其进行排序。用 usort() 排序也没有用。

这是我的数组

array:7 [▼
  "21-07-2017" => array:1 [▶]
  "04-09-2017" => array:3 [▶]
  "27-07-2017" => array:1 [▶]
  "31-07-2017" => array:1 [▶]
  "01-08-2017" => array:2 [▶]
  "05-09-2017" => array:1 [▶]
  "15-09-2017" => array:1 [▶]
]

这就是我所做的。

usort($date, function($a, $b) {
          foreach ($a as $value1) {
              foreach ($b as $value2) {
                  return ($value1['date'] < $value2['date']) ? -1 : 1;
              }
          }
        });

php 中是否有我缺少的内置函数?

【问题讨论】:

  • ksort 应该可以解决问题,您能否展示您期望的结果。
  • 这里已经有一篇关于如何对日期数组进行排序的帖子:stackoverflow.com/questions/40462778/…
  • 提供的 ans 对您有用吗?
  • ksort 无法正确排序您的日期,因为它们是 d-m-Y 格式,但 ksort 只能将它们视为字符串,因此它将按第一个数字排序,即月份的日期,而不是数字本月的。这就是为什么 user2486 有一个很好的解决方案,将每个键转换为时间戳,然后对它们进行排序。

标签: php arrays sorting


【解决方案1】:

通过strtotime函数将日期转换为字符串,然后使用ksort按键排序

 $temp = array();
 foreach($arr as $key=>$value){
     $temp[strtotime($key)] = $value;
 }
 ksort($temp);
 $new = array();
 foreach($temp as $key=>$value){
      $new[date("d-m-Y",$key)] = $value;
 }
 print_r($new);

现场演示:https://eval.in/862064

【讨论】:

  • @salathe : 我更新了
  • 与其创建新数组,不如直接在usort函数中做时间戳转换和比较,这样就可以保持OP希望的原始数组?
  • @i-man : 兄弟我可能是错的,但我认为他只是尝试使用 usort 并不难且快速地仅使用 usort 。虽然usort 是按值而不是键对数组进行排序。如果您按您所说的提供,那就太好了。
  • @user2486 我赞成你的回答,因为我认为它应该被接受,并同意你的观点,但只是想如果原始数组已排序,OP 可能会接受它
  • 我使用了相同的数组,OP没有给出完整的数组。
【解决方案2】:

您的日期值未采用Y-m-d 格式——这种格式可以简单地自然排序为字符串值。当您没有从大到小排序的日期/时间单位时,您将需要解析字符串并将其转换为可以正确比较的格式。

您的日期格式已经是欧洲格式,strtotime() 将正确解析该值。使用uksort() 比较转换为unix 次后的值。这将在不修改原始键的情况下对数组 ASC 进行排序。

代码:(Demo)

$array = [
    "21-07-2017" => ['a'],
    "04-09-2017" => ['b'],
    "27-07-2017" => ['c'],
    "31-07-2017" => ['d'],
    "01-08-2017" => ['e'],
    "05-09-2017" => ['f'],
    "15-09-2017" => ['g'],
];

uksort($array, function($a, $b) { return strtotime($a) <=> strtotime($b);});

var_export($array);

输出:

array (
  '21-07-2017' => 
  array (
    0 => 'a',
  ),
  '27-07-2017' => 
  array (
    0 => 'c',
  ),
  '31-07-2017' => 
  array (
    0 => 'd',
  ),
  '01-08-2017' => 
  array (
    0 => 'e',
  ),
  '04-09-2017' => 
  array (
    0 => 'b',
  ),
  '05-09-2017' => 
  array (
    0 => 'f',
  ),
  '15-09-2017' => 
  array (
    0 => 'g',
  ),
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2023-03-31
    • 2020-10-26
    • 1970-01-01
    相关资源
    最近更新 更多