使用日期作为键排序数组

时间:2017-09-14 16:52:49

标签: php arrays sorting

我有一个数组,其键是日期,我想按升序排序。我尝试用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中有没有内置的功能,我不知道了吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您的日期值未采用 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',
  ),
)