2009-11-29 127 views
1

如果您有一组ISO日期,您将如何计算阵列中两个连续日期之间的最长时间?计算两个连续日期之间的最大天数

$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');

我想我需要一个循环,某种迭代变量和排序。我无法弄清楚。

这实际上是从MYSQL输出。

+0

那是什么输出? – 2009-11-29 07:34:00

+0

我不明白。你找到答案了吗?如果是这样,请在您自己的答案中用代码提供代码并将其标记为已解决,或者如果这些答案非常接近,请将其中一个答案标记为正确答案。 – 2009-11-29 13:29:40

回答

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

?> 

它循环扔你r项目(它比项目数量少执行一次)并比较每个项目。如果比较结果大于下一个,则更新最大值。时间以秒为单位,因此循环结束后,我们将秒转换为天。

+0

恐怕这种方法不适用于几个原因。 1)它只测试所有可能差异的一个子集,例如数组中的第一个数据之间的差异,并说第三个数据从未被评估过。 2)它假定这两个日期按照升序排列。一个简单的测试可以修复#2,#1需要引入一个内部循环。 (这种方法btw效率较低,仅仅查找最小和最大日期并减去它们) – mjv 2009-11-29 06:23:23

+0

问题是“连续日期之间的最大间隔”,因此第一次和第三次之间的距离是无关紧要的。由于问题列出了ASC顺序中的日期,我假定它们与MySQL的顺序相同。 – 2009-11-29 13:23:01

+0

@dcneiner我明白你的观点,现在。有了这个问题的理解,你的答案当然是正确的。我并没有选择“顺序”,而是在提出可能需要“排序”的问题上提出了解决方案。 +1给你一个正确答案(在这个问题的这个视图中),我会编辑我的两个可能的答案。无论如何,我们可能会努力尝试一个措辞不佳的问题,而且一般不会回答(甚至是响应)OP ;-) – mjv 2009-11-29 17:25:20

1

EDIT
如[原本]措辞问题可以被理解[至少;-)]有两种方式:

  • A)该数组包含以升序日期的列表。任务是找到连续的之间的长度(以天数表示)数组中的日期。 B)该数组不一定是排序的。任务是找到longuest期(表达式中的天数)任意两个日期数组中

之间下面提供了一个答案的问题的“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)的时间,那是)。
算法很简单:
将[最小值和最大值]设置为[未排序]列表中的第一项。
迭代通过列表中的每个下列项目,它与最小值比较和更换,如果发现小,做这样明智的最大值...

在手最小值和最大值,一个简单的差别使得天的最大数量...
在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

MIN和MAX并不真正相关。日期之间的最长时间不一定是MIN或MAX(日期)。我可以在每一行之间做一个DATEDIFF,但我不确定你会怎么写。 – rrrfusco 2009-11-29 05:34:31

+0

除非我误解了这个问题,Min和Max非常相关。尽管您比较阵列中所有可能的日期对的计划也可以发挥作用,但这种方法最终还是要做更多的工作。除了必须跟踪最小值和最大值(“迄今为止”),在你的情况下,差值的最小/最大值,但最小值/最大值都是一样的......,你需要执行n *(n - 1)差异,这使得算法O(n^2),更不用说与管理所有对的生成相关的开销/复杂性... – mjv 2009-11-29 05:46:57

+0

您如何编写SQL取决于数据的结构。如果你有一个日期字段,你可以这样写: 如果你正在尝试计算一行中的两个日期,那么你可以写下如下的代码: “select TO_DAYS(MIN(mydate),MAX(mydate))from mytable where cust_id =然后: “select DATEDIFF(date1,date2)作为numdays,MAX(numdays)从表中where xxxx group by xxxx” – Darkerstar 2009-11-29 05:55:10

1

这PHP脚本会给你最大的间隔

1){ 为($ I = 0; $ I $ maxinterval)$ maxinterval = $天; } } ?>
相关问题