多维数组在两个日期的中间找到

时间:2011-11-24 16:51:07

标签: php multidimensional-array

我有一个类似下面的数组

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有没有快速而肮脏的方法呢?我对性能有点担心,所以如果有一种可能性能更好的方法,我会很感激。

3 个答案:

答案 0 :(得分: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;

否则,每次运行检查循环时,您都会将这些字符串转换为时间值,这会非常快。始终以原生格式存储时间/日期,并仅在必要时转换为人类可读。

答案 1 :(得分: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;

    }

答案 2 :(得分:0)

“所以今天会说2011-11-30T09:50-04:00”

该问题的这一行表明,我们试图互换使用日历日期和本地化时间戳。

这比尝试在日历日期和纯时间戳之间切换更好,但它仍然不明确。

如果是关于日历日期,请将其存储为例如日期,例如2011-11-24

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

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

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

日历日期代表一个日历日期 - 以时间戳开始和结束,时间戳取决于某个地方的管辖范围。

无论您是使用ISO-8601字符串表示还是数字表示,都要注意清楚您的意图。

乍一看,时间似乎很容易。

但实际上,时间只是最容易出错的事情之一。