如何在数组中找到最大和最小日期?

13

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

我有一个包含以下值的$date_arr数组,

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

我需要获取最大的日期为“20-05-2015”,最小的日期为“02-01-2015”。

我该如何实现?

5个回答

20

max()min()可以很好地处理您的数组:

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

最佳方法!谢谢!即使使用“2018-12-06T10:00:00.000”格式也可以工作。 - Imeksbank
7
这个回答误导了研究人员,并且不能在OP的“dd-mm-yyyy”格式的字符串中使用。这个答案是错误的。在其他以年份开始并逐渐变小的日期格式的情况下,这种方法可以正常工作。 - mickmackusa
请注意,无论是 null 还是任何其他空字符都将被视为最小值。 - М.Б.
@mickmackusa 我并不认为格式是个问题,可以使用strtotime()函数来转换时间戳的值。 - Relcode
但是这个答案没有调用 strtotime() 将字符串转换为可比较的格式,因此会误导研究人员。@Reln 观看 Azima 的答案失败。 - mickmackusa

17
<?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];


?>

3
为什么你要按照增加复杂度至少为 nlog(n) 的顺序排序日期?你可以直接遍历所有的日期。 - Eternal
我不知道为什么,但它不起作用... $date_arr[0] 返回最大值,$date_arr[count($date_arr) - 1] 返回中间值 :( 那最小值呢? - Ngô Văn Quyền
@Eternal,没错,你说得对,但实际上,这种方法保留了给定的日期格式。否则,它会更快。 - М.Б.

4

请尝试以下方法

$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));

1
我喜欢它,因为它更深入,不太依赖于PHP函数!我需要在VB中使用它,确实可以通过一些简单的函数转换来使用它。这个解决方案优雅、简单、清晰,并且 - 如我所说 - 通用!谢谢 - Teo
这个答案不够简洁优雅,而是显得啰嗦冗长。它还在日期字符串中不必要地添加了时间组件。每次迭代都会重新计算一次,这是没有必要的。在循环中使用 strtotime() 就足够了,不需要额外调用 date() - mickmackusa

0

虽然从计算时间复杂度来看,array_multisort()并不是最佳选择,但它是一种明智、易读和简洁的方法。我的片段只会在每个元素上调用一次strtotime()——这是usort()无法达到的。

代码:(演示)

$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时间格式的日期副本即可。

代码:(演示

$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(),这里是最现代的语法,包括太空船操作符和箭头函数语法。(演示

usort($dates, fn($a, $b) => strtotime($a) <=> strtotime($b));

printf(
    "Latest Date: %s\nEarliest Date: %s",
    $dates[array_key_last($dates)],
    $dates[0]
);

这项任务肯定可以用十几种不同的方法完成。我考虑使用foreach()循环并设置条件来维护临时变量,同时进行迭代比较,但我觉得这对于一个相当简单的任务来说过于复杂了。


-1
$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;

1
虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题,将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Brian61354270
这是对不同问题的正确答案。因为 OP 的问题显示输入日期格式为 dd-mm-yyyy,所以您的解决方案对于此页面是不正确的。在每次迭代中计数而不是缓存计数是更好的实践。此外,这是一个仅包含代码的答案,这意味着它在 Stack Overflow 上的价值较低。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接