2012-03-29 138 views
0

嗨,大家好我有一個填充日期操縱PHP數組

Array 
(
    [0] => 2012-04-04 
    [1] => 2012-04-06 
    [2] => 2012-04-06 
    [3] => 2012-04-06 
    [4] => 2012-04-06 
    [5] => 2012-04-06 
    [6] => 2012-04-06 
    [7] => 2012-04-11 
    [8] => 2012-04-12 
    [9] => 2012-04-12 
    [10] => 2012-04-13 
    [11] => 2012-04-13 
    [12] => 2012-04-13 
    [13] => 2012-04-13 
    [14] => 2012-04-13 
    [15] => 2012-04-13 
    [16] => 2012-04-13 
) 

數組如何將我遍歷數組,發現在項目之間天差旁邊陣列對方。例如,我想呼應OUT [0]和[1]是 「2」 天之間

差 [1]和[2]爲 「0」 天

之間差

:)

管理從頂部的答案得到一些輸出,但我只希望它顯示,如果有日期的差異。

從這個if語句沒有輸出,但 - 更新 -

$count = count($datestack); 



for ($i = 0; $i < $count - 1; $i++) { 
    $datetime1 = new DateTime($datestack[$i]); 
    $datetime2 = new DateTime($datestack[$i + 1]); 
    $interval = $datetime1->diff($datetime2); 
    if ($arr[$i] === $arr[$i+1]){ 
    echo $interval->format('%R%a days'); 
    } 

} 
+0

嘗試堅持與您的問題.. http://stackoverflow.com/questions/9917611/inserting-an-image-multiple-times-based-on-difference-between-2-numbers -php http://stackoverflow.com/questions/9918065/looping-json-document-loading-string-into-array-then-manipulating-the-document – 2012-03-29 02:30:36

+0

道歉我認爲這是一個稍微不同的問題,因爲我正在努力與突出顯示數組項目的語法 – user1064660 2012-03-29 02:32:58

回答

3

你需要的是DateTime::diff

例子:

$datetime1 = new DateTime('2012-04-04'); 
$datetime2 = new DateTime('2012-04-06'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%R%a days'); 

,你只需要循環的數組做你想做什麼。

$count = count($arr); 
for ($i = 0; $i < $count - 1; $i++) { 
    $datetime1 = new DateTime($arr[$i]); 
    $datetime2 = new DateTime($arr[$i + 1]); 
    $interval = $datetime1->diff($datetime2); 
    echo $interval->format('%R%a days'); 
} 
+0

數組項的語法是什麼,而不是2個單獨的變量? – user1064660 2012-03-29 02:32:24

+0

@ user1064660檢查我的更新,舉個例子。 – xdazz 2012-03-29 02:36:19

+0

+1非常適合給定問題的最安全解決方案。 – brezanac 2012-03-29 04:03:15

0

是這樣的?

 foreach($input as $k=>$i){ if(empty($input[$k-1])) continue; echo "<br /> difference between [".($k-1)."] and [".$k."] is ".'"'.round(abs(strtotime($i)-strtotime($input[$k-1]))/(3600*24)).'"'." days "; }; 
0
<?php 
    $dates = array(
     '2012-04-04', 
     '2012-04-06', 
     '2012-04-06', 
     '2012-04-06', 
     '2012-04-06', 
     '2012-04-06', 
     '2012-04-06', 
     '2012-04-11', 
     '2012-04-12', 
     '2012-04-12', 
     '2012-04-13', 
     '2012-04-13', 
     '2012-04-13', 
     '2012-04-13', 
     '2012-04-13', 
     '2012-04-13', 
     '2012-04-13' 
    ); 

    array_walk($dates, function($item, $key) { 
     static $previous = null; 
     if ($previous != null) { 
      $datetime1 = new DateTime($previous); 
      $datetime2 = new DateTime($item); 
      $interval = $datetime1->diff($datetime2); 
      echo $interval->format('%R%a days') . "\n"; 
     } 
     $previous = $item; 
    }); 

?> 
+0

我不認爲我的PHP版本支持該功能,我收到一個T_FUNCTION錯誤。無論如何,我可以繞過它嗎? – user1064660 2012-03-29 04:54:47

+0

聽起來像你不在PHP 5.3,所以你不能通過lambda。您需要將'function($ item,$ key)...'部分提取到獨立函數'process processDate($ item,$ key)...'中。現在,您可以將'processDate'作爲第二個參數傳遞給array_walk。 – 2012-03-30 02:06:28

+0

沒錯,這個解決方案只適用於> = PHP5.3 – 2012-03-30 23:04:25