2012-03-29 67 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