2011-11-24 85 views
0

我有一个像下面多维数组发现两个日期

array(
    "hgfh" => array("s" => "2011-11-28T07:00-04:00", "e" => "2011-11-29T06:59-04:00"), 
    "hgfh" => array("s" => "2011-11-29T07:00-04:00", "e" => "2011-11-30T06:59-04:00"), 
    "hgfh" => array("s" => "2011-11-30T07:00-04:00", "e" => "2011-12-01T06:59-04:00"), 
    "hgfh" => array("s" => "2011-12-01T07:00-04:00", "e" => "2011-12-02T06:59-04:00"), 
    "hgf"  => array("s" => "2011-12-02T07:00-04:00", "e" => "2011-12-05T06:59-04:00"), 
    "sog"  => array("s" => "2011-12-05T07:00-04:00", "e" => "2011-12-06T06:59-04:00"), 
    "gfd"  => array("s" => "2011-12-06T07:00-04:00", "e" => "2011-12-07T06:59-04:00"), 
    "gfd"  => array("s" => "2011-12-07T07:00-04:00", "e" => "2011-12-08T06:59-04:00"), 
    "bob" => array("s" => "2011-12-08T07:00-04:00", "e" => "2011-12-09T06:59-04:00"), 
    "tree" => array("s" => "2011-12-09T07:00-04:00", "e" => "2011-12-11T23:00-04:00"), 
); 

例如,一个数组中,我需要确定当前date("c");是数组中的"s""e"之间再拿到键。所以它会说今天是2011-11-30T09:50-04:00,并确定关键是hgfh有没有快速和肮脏的方法来做到这一点?我对性能有点担心,所以如果有一种更好的性能方法,我会很感激。

+0

你有相同的索引'hgfh' 4次,这是一个错误的复制和粘贴? –

+0

这是垃圾数据哈哈 – Steven

回答

2

将日期作为字符串存储,尤其是当您想要做这种'间'比较时,无论您做什么都会很痛苦。您应该存储表示那些时间的原始PHP时间戳值,例如

array(
    'hgfh' => array('s' => 1000, 'e' => 2000) 
    etc... 
) 

(使用明显假的时间戳值)。然后,它变成一个简单的问题:

$check = strtotime('2011-11-30T09:50-04:00'); 
foreach($yourarray as $key => $times) { 
    if (($check >= $times[s]) && ($check <= $times[e])) 
     break; 
    } 
} 
echo $key; 

否则你坚持将每次运行检查循环,它得到昂贵的速度非常快,那些字符串的时间值。始终以原生格式存储时间/日期,并根据需要将其转换为人类可读的。

0
function get_matches($date_array) { 

     $new_date_array = array_filter($date_array, 'match_dates'); 

     print_r(array_keys($new_date_array)); 

    } 

    function match_dates($array_element) { 

     return date('c') >= $array_element['s'] && date('c') <= $array_element['e'] ? true : false; 

    } 
0

“因此,它会说今天是2011-11-30T09:50-04:00”

从这个问题行表明,有使用日历日期和本地化时间戳的尝试互换。

这比试图在日历日期和纯时间戳之间进行切换要好,但仍然不明确。

如果是关于日历日期,则将它们存储为这样,例如, 2011-11-24

如果性能很重要,您可以将这些日历存储为例如。修改儒略日期。

时间戳表示绝对时间点,通常以秒为单位。

本地化时间戳表示绝对时间点的组合,通常以秒为单位加上有效时区偏移量,通常以小时或分钟为单位。

日历日期表示日历日期 - 开始和结束时间戳取决于某个地方的管辖权定义的时间戳。

无论您是否使用ISO-8601字符串表示法或数字表示法,始终注意清楚您的意图。

时间似乎很容易乍一看。

但时间反而实际上只是最容易出错的一种。