我需要使用PHP从给定的数组中找到最大和最小日期。
我有一个包含以下值的$date_arr数组,
$date_arr = array('0'=>'20-05-2015','1'=>'02-01-2015','2'=>'30-03-2015');
我需要获取最大的日期为“20-05-2015”,最小的日期为“02-01-2015”。
我该如何实现?
max()
和min()
可以很好地处理您的数组:
echo "Latest Date: ". max($dates)."\n";
echo "Earliest Date: ". min($dates)."\n";
<?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];
?>
请尝试以下方法
$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));
strtotime()
就足够了,不需要额外调用 date()
。 - mickmackusa虽然从计算时间复杂度来看,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()
循环并设置条件来维护临时变量,同时进行迭代比较,但我觉得这对于一个相当简单的任务来说过于复杂了。
$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;
dd-mm-yyyy
,所以您的解决方案对于此页面是不正确的。在每次迭代中计数而不是缓存计数是更好的实践。此外,这是一个仅包含代码的答案,这意味着它在 Stack Overflow 上的价值较低。 - mickmackusa
null
还是任何其他空字符都将被视为最小值。 - М.Б.strtotime()
将字符串转换为可比较的格式,因此会误导研究人员。@Reln 观看 Azima 的答案失败。 - mickmackusa