2009-11-29 125 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 = $天; } } ?>
相關問題