在PHP中查找具有相同键的多个日期之间的特定差异

时间:2013-02-13 10:18:25

标签: php arrays date

我从SQL语句中获取一些元素,并将它们放在一个数组中。

我想要做的是找出数组中这些元素的日期之间的具体差异,并将它们添加到另一个数组中。

数据库的结果如下所示(key => value):

array(
    "10"=>"13-02-2013 09:47:16", 
    "10"=>"13-02-2013 09:47:00", 
    "10"=>"13-02-2013 09:46:50",  
    "10"=>"13-02-2013 09:42:50", 
    "20"=>"13-02-2013 09:30:50", 
    "20"=>"13-02-2013 09:20:50", 
    "30"=>"13-02-2013 09:10:15"
);

我需要找到具有相同ID(键)的元素,其中日期之间的差异小于60秒。例如,我想看一个输出:

array(
    "10"=>"13-02-2013 09:47:16", 
    "10"=>"13-02-2013 09:47:00", 
    "10"=>"13-02-2013 09:46:50"
);

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

一个阵列不能同时拥有相同的密钥。每个元素都有唯一的键 每当您尝试读取此数组时,它将显示:

Array
(
[10] => 13-02-2013 09:42:50
[20] => 13-02-2013 09:20:50
[30] => 13-02-2013 09:10:15
)

如果要检索键为“10”的所有元素,则必须使用多维数组,同时从数据库中检索数据。

$new_arr = array();
// Put database data object in place of $arr
foreach($arr as $k => $v){
    if(array_key_exists($k,$new_arr)){
        $new_arr[$k][] = $v;
    }
    else{
        $new_arr[$k] = $v;
    }
}

这里$ new_arr将采用以下形式:

$new_arr = array("10"=> array([0] => '13-02-2013 09:47:16'),
                        array([1] => '13-02-2013 09:47:00'),
                        array([2] => '13-02-2013 09:46:50'),
                 "20" => '',
                  ........
               )

然后你可以选择你想要的值。

答案 1 :(得分:0)

嗯,我引用abc667和Jon,但是如果你想比较日期,你可以用一个简单的for扫描所有数组并比较数组中的当前日期和下一个..如果你使用一个名为$ cont的变量for ,如果$ cont = 1,第一个日期是$ array [1]($ array [$ cont]),第二个日期是$ array [2]($ array [$ cont + 1])。 我做了一个简单的例子(如果它运行,我会看到ivent,但我希望如此; P) 看看你的数组在我的例子中被称为 $ array_dates ,而ivent创建了新数组,但它很简单,你可以在for循环中添加它。

<?php

// example >>> $array_dates[1] = '2013-2-13 12:30:00'; 

// scan all the array with the date
for ($cont=0; $cont<count($array_dates); $cont++)
    {
    $date_1 = $array_dates[$cont];
    $date_2 = $array_dates[$cont+1];

list($data1,$His1) = explode(' ',$date_1); 
list($year1,$month1,$day1) = explode('-',$data1); 
list($hour1,$min1,$sec1) = explode(':',$His1); 

list($data2,$His2) = explode(' ',$date_2); 
list($year2,$month2,$day2) = explode('-',$data2); 
list($hour2,$min2,$sec2) = explode(':',$His2); 

$diff=mktime($hour2,$min2,$sec2,$month2,$day2,$year2)-mktime($hour1,$min1,$sec1,$month1,$day1,$year1); 

$diff = mktime($hour2, $min2,$sec2, $month2,$day2,$year2) - mktime($hour1,$min1,$sec1, $month1,$day1,$year1); 

$diff1  = floor($diff % (60*60*24)); 
$diff2  = floor($diff1 % (60*60)) ; 
$sec    = $diff2 % 60; 


echo "<br>Seconds difference from <u>$date_1</u> and <u>$date_2</u>: <em>$sec</em><br>";

} //end of the for cycle
?>

我希望你会欣赏它, 最好的问候。

编辑:

你必须把月份放在我放的格式中,'因为mktime在数字之前使用零(它认为是八进制的!)...然而你可以在php.net中读取日期格式