【问题标题】:How can I find the maximum and minimum date in an array?如何在数组中找到最大和最小日期?
【发布时间】:2015-02-24 05:13:43
【问题描述】:

我需要使用 PHP 从给定数组中找到最大和最小日期。

我的 $date_arr 包含以下值,

  $date_arr = array('0'=>'20-05-2015','1'=>'02-01-2015','2'=>'30-03-2015');

在这里,我需要将较大的日期设为“20-05-2015”,将最小日期设为“02-01-2015”。

我怎样才能做到这一点?

【问题讨论】:

    标签: php arrays algorithm


    【解决方案1】:
    <?php
    
    $date_arr=array(0=>'20-05-2015',1=>'02-01-2015',2=>'30-03-2015');
    
    usort($date_arr, function($a, $b) {
        $dateTimestamp1 = strtotime($a);
        $dateTimestamp2 = strtotime($b);
    
        return $dateTimestamp1 < $dateTimestamp2 ? -1: 1;
    });
    
    echo 'Min: ' . $date_arr[0];
    echo '<br/>';
    echo 'Max: ' . $date_arr[count($date_arr) - 1];
    
    
    ?>
    

    【讨论】:

    • 你为什么要对日期进行排序,将复杂度增加到至少 nlog(n)?您可以遍历所有日期
    • 我不知道为什么,但它不起作用... $date_arr[0] 返回最大一个,$date_arr[count($date_arr) - 1] 返回中等一个 :( 怎么样最少一个?
    • @Eternal 是的,很好,但实际上,这种方法保留给定的日期格式。否则,它会更快。
    【解决方案2】:

    max()min() 可与您的数组完美搭配:

    echo "Latest Date: ". max($dates)."\n";
    echo "Earliest Date: ". min($dates)."\n";
    

    【讨论】:

    • 最佳方法!谢谢 !甚至可以使用 '2018-12-06T10:00:00.000' 格式。
    • 这个答案会误导研究人员,并且不适用于 OP 的 dd-mm-yyyy 格式化字符串。这个答案是不正确的。在其他情况下,日期格式从年份开始并逐渐变为更小的单位,这可以正常工作。
    • 请注意,无论null 或任何其他空字符是否存在,这都是最小值。
    • @mickmackusa 我真的不认为格式有问题,strtotime() 可以用来转换时间戳值。
    • ... 但这个答案并没有调用strtotime() 将字符串转换为可比较的格式,因此会误导研究人员。 @Reln Watch Azima's answer fail.
    【解决方案3】:

    请试试这个

    $date_arr = array('0' => '20-05-2015', '1' => '02-01-2015', '2' => '30-03-2015');
    for ($i = 0; $i < count($date_arr); $i++)
    {
        if ($i == 0)
        {
            $max_date = date('Y-m-d H:i:s', strtotime($date_arr[$i]));
            $min_date = date('Y-m-d H:i:s', strtotime($date_arr[$i]));
        }
        else if ($i != 0)
        {
            $new_date = date('Y-m-d H:i:s', strtotime($date_arr[$i]));
            if ($new_date > $max_date)
            {
                $max_date = $new_date;
            }
            else if ($new_date < $min_date)
            {
                $min_date = $new_date;
            }
        }
    }
    echo date('d-m-Y',strtotime($max_date));
    echo date('d-m-Y',strtotime($min_date));
    

    【讨论】:

    • 我喜欢它,因为它更深,不依赖 PHP 函数!我在 VB 中需要它,果然我可以通过一些简单的函数转换来使用它。解决方案优雅、简单、清晰,而且——正如我所说——通用!谢谢
    • 这个答案并不优雅;它很冗长。它还不必要地向日期字符串添加时间组件。它正在对每次迭代进行重新计数。如果没有循环中所有额外的 date() 调用,strtotime() 会很好。
    【解决方案4】:

    认为它在技术上并不能提供最低的计算时间复杂度,array_multisort() 是一种明智、易读、简洁的方法。我的 sn-p 只对每个元素调用一次 strtotime() -- usort() 无法匹配此声明。

    代码:(Demo)

    $dates = ['20-05-2015', '02-01-2015', '30-03-2015', '10-01-1990'];
    array_multisort(array_map('strtotime', $dates), $dates);
    
    printf(
        "Latest Date: %s\nEarliest Date: %s",
        $dates[array_key_last($dates)],
        $dates[0]
    );
    

    输出:

    Latest Date: 10-01-1990
    Earliest Date: 20-05-2015
    

    要通过调用min()max() 获得相同的结果,只需创建一个格式化的unix 时间日期副本。

    代码:(Demo)

    $unix = array_map('strtotime', $dates);
    
    printf(
        "Latest Date: %s\nEarliest Date: %s",
        date('d-m-Y', max($unix)),
        date('d-m-Y', min($unix))
    );
    

    如果您想使用usort(),这里是最现代的语法,带有太空船运算符和箭头函数语法。 (Demo)

    usort($dates, fn($a, $b) => strtotime($a) <=> strtotime($b));
    
    printf(
        "Latest Date: %s\nEarliest Date: %s",
        $dates[array_key_last($dates)],
        $dates[0]
    );
    

    这项任务肯定可以通过数十种不同的方式来完成。我考虑编写一个 foreach() 循环,在进行迭代比较的同时保持临时变量的条件,但我觉得对于一个相当简单的任务来说它过于复杂。

    【讨论】:

      【解决方案5】:
      $date_arr=array(0=>'2015-05-20',1=>'2015-02-21',2=>'2015-04-13',3=>'2020-04-30',4=>'2020-04-13');
      
      $max_date=$date_arr[0];
      for($i=0;$i<count($date_arr);$i++)
      {
          echo $date_arr[$i]. ' ,';
          if( $max_date < $date_arr[$i+1])
          {
              $max_date=$date_arr[$i+1];
          }
      }  
      echo " Max= ". $max_date;
      

      【讨论】:

      • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
      • 这是另一个问题的正确答案。因为 OP 的问题以dd-mm-yyyy 的格式显示输入日期,所以您的解决方案对于此页面不正确。缓存计数而不是计数每次迭代也是更好的做法。此外,这是一个纯代码答案,这意味着它在 Stack Overflow 上的价值很低。
      猜你喜欢
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      相关资源
      最近更新 更多