如果您有一組ISO日期,您將如何計算陣列中兩個連續日期之間的最長時間?計算兩個連續日期之間的最大天數
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');
我想我需要一個循環,某種迭代變量和排序。我無法弄清楚。
這實際上是從MYSQL輸出。
如果您有一組ISO日期,您將如何計算陣列中兩個連續日期之間的最長時間?計算兩個連續日期之間的最大天數
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');
我想我需要一個循環,某種迭代變量和排序。我無法弄清楚。
這實際上是從MYSQL輸出。
這裏是你如何在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項目(它比項目數量少執行一次)並比較每個項目。如果比較結果大於下一個,則更新最大值。時間以秒爲單位,因此循環結束後,我們將秒轉換爲天。
恐怕這種方法不適用於幾個原因。 1)它只測試所有可能差異的一個子集,例如數組中的第一個數據之間的差異,並說第三個數據從未被評估過。 2)它假定這兩個日期按照升序排列。一個簡單的測試可以修復#2,#1需要引入一個內部循環。 (這種方法btw效率較低,僅僅查找最小和最大日期並減去它們) – mjv 2009-11-29 06:23:23
問題是「連續日期之間的最大間隔」,因此第一次和第三次之間的距離是無關緊要的。由於問題列出了ASC順序中的日期,我假定它們與MySQL的順序相同。 – 2009-11-29 13:23:01
@dcneiner我明白你的觀點,現在。有了這個問題的理解,你的答案當然是正確的。我並沒有選擇「順序」,而是在提出可能需要「排序」的問題上提出瞭解決方案。 +1給你一個正確答案(在這個問題的這個視圖中),我會編輯我的兩個可能的答案。無論如何,我們可能會努力嘗試一個措辭不佳的問題,而且一般不會回答(甚至是響應)OP ;-) – mjv 2009-11-29 17:25:20
EDIT:
如[原本]措辭問題可以被理解[至少;-)]有兩種方式:
之間下面提供了一個答案的問題的「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);
?>
MIN和MAX並不真正相關。日期之間的最長時間不一定是MIN或MAX(日期)。我可以在每一行之間做一個DATEDIFF,但我不確定你會怎麼寫。 – rrrfusco 2009-11-29 05:34:31
除非我誤解了這個問題,Min和Max非常相關。儘管您比較陣列中所有可能的日期對的計劃也可以發揮作用,但這種方法最終還是要做更多的工作。除了必須跟蹤最小值和最大值(「迄今爲止」),在你的情況下,差值的最小/最大值,但最小值/最大值都是一樣的......,你需要執行n *(n - 1)差異,這使得算法O(n^2),更不用說與管理所有對的生成相關的開銷/複雜性... – mjv 2009-11-29 05:46:57
您如何編寫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
這PHP腳本會給你最大的間隔
1){ 爲($ I = 0; $ I $ maxinterval)$ maxinterval = $天; } } ?>
那是什麼輸出? – 2009-11-29 07:34:00
我不明白。你找到答案了嗎?如果是這樣,請在您自己的答案中用代碼提供代碼並將其標記爲已解決,或者如果這些答案非常接近,請將其中一個答案標記爲正確答案。 – 2009-11-29 13:29:40