如果您有一系列ISO日期,您如何计算阵列中两个连续日期之间的最多天数?
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');
我认为我需要一个循环,某种迭代变量和一种排序。我无法弄明白。
这实际上是从MYSQL输出的。
答案 0 :(得分:1)
修改强>:
正如[最初]措辞一样,这个问题可以通过[至少;-)]两种方式来理解:
以下提供了对该问题的“B”理解的答案。有关“A”的回复,请参阅dcneiner的解决方案
不需要排序!...
如果它来自MySQL,您可以让此DBMS直接返回所考虑列表的MIN和MAX值
编辑:正如Darkerstar所指出的,数据结构的方式[以及返回问题中指示的完整列表的现有SQL查询]通常决定了生成MIN和MAX值的查询的结构方式。
也许是这样的:
SELECT MIN(the_date_field), MAX(the_date_field)
FROM the_table
WHERE -- whatever where conditions if any
--Note: no GROUP BY needed
如果以某种方式不能使用SQL,单次通过列表将允许您获取列表中的MIN和MAX值(在O(n)时间内)。
算法很简单:
将最小值和最大值设置为[未排序]列表中的第一项
迭代列表中的每个后续项目,将其与最小值进行比较,如果发现较小则替换它,并对Max值进行相似的操作......
手中有最小值和最大值,一个简单的差异给出最大天数...
在PHP中,它看起来如下:
<?php
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');
# may need this as suggested by dcneiner
date_default_timezone_set("GMT");
$max = $array[0];
$min = $max;
for($i = 1; $i < count($array); $i++){
// Note that since the strings in the array are in the format YYYY-MM-DD,
// they can be compared as-is without requiring say strtotime conversion.
if ($array[$i] < $min)
$min = $array[$i];
if ($array[$i] > $max)
$max = $array[$i];
}
$day_count = (strtotime($max) - strtotime($min)) / (60*60*24);
?>
答案 1 :(得分:1)
以下是如何在PHP中执行此操作:
<?php
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');
# PHP was throwing errors until I set this
# it may be unnecessary depending on where you
# are using your code:
date_default_timezone_set("GMT");
$max = 0;
if( count($array) > 1 ){
for($i = 0; $i < count($array) - 1; $i++){
$start = strtotime( $array[$i] );
$end = strtotime( $array[$i + 1] );
$diff = $end - $start;
if($diff > $max) $max = $diff;
}
}
$max = $max / (60*60*24);
?>
它循环抛出你的物品(它比物品数量少一个时间执行)并比较每一个物品。如果比较大于下一个,则更新最大值。时间以秒为单位,因此在循环结束后,我们将秒数转换为几天。
答案 2 :(得分:1)
此PHP脚本将为您提供最大的间隔
1){ for($ i = 0; $ i $ maxinterval)$ maxinterval = $ days; } } ?&GT;