【问题标题】:How sort date in array form oldest to newest php如何以数组形式对日期进行排序最旧到最新的php
【发布时间】:2016-02-16 20:41:44
【问题描述】:

我有问题。 我无法从最旧到最新对数组中的日期进行排序;/ 我的数组:

$arr = array('2013-02-01','2000-02-01','2016-02-17','0000-00-00','0000-00-00','0000-00-00');

我想要输出

array(
[0] => '2000-02-01',
[1] => '2013-02-01',
[2] => '2016-02-01',
[3] => '0000-00-00',
[4] => '0000-00-00',
[5] => '0000-00-00',
)

我在 usort 中使用自己的函数回调,但这不起作用;/

function sortDate($a, $b)
{
    if ($a == $b) {
        return 0;
    } elseif($a == '0000-00-00') {
        return 1;
    }

    return strtotime($a) < strtotime($b) ? 1 : -1;
}

有人有解决方案的想法吗?

【问题讨论】:

  • 简单的sort 在这种情况下会这样做......
  • 如果 a
  • 我使用了 sort 函数,但没有帮助。您可以在 phpfiddle 上显示我的代码:phpfiddle.org/main/code/yfn3-ugmt
  • @devbochenek 我想我明白了

标签: php arrays sorting date


【解决方案1】:

最好的排序是:

usort($childs, function ($a, $b) {
            if ($a == '0000-00-00')
                return 1;

            if ($b == '0000-00-00')
                return -1;

            if ($a == $b)
                return 0;

            return ($a < $b) ? -1 : 1;
        });

【讨论】:

    【解决方案2】:

    这将给出您希望在 PHP 版本 5.3.22 - 5.6.18 中测试的结果,但是 PHP 7 中发生了影响 usort 函数的更改:

    $arr = array('2013-02-01','2000-02-01','2016-02-17','0000-00-00','0000-00-00','0000-00-00');
    
    sort( $arr );
    usort( $arr, function( $a, $b )
    {
        if ( $a === $b ) return 0;
        if ( strpos( $b, '0000' ) !== false ) return -1;
        return ( $a < $b ) ? -1 : 1;
    });
    

    输出:

    Array
    (
        [0] => 2000-02-01
        [1] => 2013-02-01
        [2] => 2016-02-17
        [3] => 0000-00-00
        [4] => 0000-00-00
        [5] => 0000-00-00
    )
    

    测试:

    https://3v4l.org/0Tvlm

    【讨论】:

      【解决方案3】:

      首先,我从数组中删除所有零值,然后根据需要对其进行排序,然后将零值添加回来:

      $arr = array('2013-02-01','2000-02-01','2016-02-17','0000-00-00','0000-00-00','0000-00-00');
      $count = count($arr);
      
      $arr = array_filter($arr, function($v) {
          if($v == '0000-00-00') {
              return false;
          } else {
              return true;
          }
      }, ARRAY_FILTER_USE_BOTH);
      
      $count -= count($arr);
      
      sort($arr);
      
      $arr = array_merge($arr, array_fill(0, $count, '0000-00-00'));
      
      print_r($arr);
      

      这会将您的数组排序如下:

      Array
      (
          [0] => 2000-02-01
          [1] => 2013-02-01
          [2] => 2016-02-17
          [3] => 0000-00-00
          [4] => 0000-00-00
          [5] => 0000-00-00
      )
      

      【讨论】:

        【解决方案4】:

        您可以向后比较日期。你有:

        return strtotime($a) < strtotime($b) ? 1 : -1;
        

        你想要:

        return strtotime($a) < strtotime($b) ? -1 : 1;
        

        你可以使用:

        return $a < $b ? -1 : 1;
        

        【讨论】:

        • 感谢您指出我的答案无效,从问题上看并不明显。但你的回答最终给了我Array ( [0] =&gt; 0000-00-00 [1] =&gt; 2000-02-01 [2] =&gt; 2013-02-01 [3] =&gt; 0000-00-00 [4] =&gt; 2016-02-17 [5] =&gt; 0000-00-00)
        • 谢谢,但它没有帮助:(我有相同的答案,但我想修复它以使其正常工作
        猜你喜欢
        • 2021-04-30
        • 2016-07-14
        • 1970-01-01
        • 2020-01-29
        • 2021-10-25
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多