从PHP中的datetime数组中过滤出记录

时间:2018-07-28 20:06:00

标签: php datetime

我有一个字符串格式的日期数组(年月日):

  • 2018-01-01
  •     
  • 2018-07-01
  •     
  • 2018-12-25

我还有一组日期时间(Y-m-d H:i:s)
    

  • 2018-07-01 9:00:00
  •     
  • 2018-07-01 15:00:00
  •     
  • 2018-07-02 9:00:00
  •     
  • 2018-07-02 15:00:00
  •     
  • 2018-07-04 9:00:00
  •     
  • 2018-07-04 15:00:00
我需要过滤出与第一个数组中任何日期的日期都不匹配的记录。
正确的结果是:     
  • 2018-07-01 9:00:00
  •     
  • 2018-07-01 15:00:00
有没有一种干净的编码方式?

2 个答案:

答案 0 :(得分:0)

您应该使用strtotime()函数并将日期和日期时间以整数保存在数组中。比起您可以对其执行任何筛选。有关更多详细信息,请显示数组并阐明要从数组中过滤的内容。

答案 1 :(得分:0)

您可以将array_filter与in_array,日期和strtotime一起使用:

<?php

$dates = array("2018-01-01","2018-07-01", "2018-12-25");
$datetimes = array(
    new DateTime('2018-07-01 12:00:00'),
    new DateTime('2018-07-01 18:30:00'),
    new DateTime('2018-07-02 10:00:00'),
    new DateTime('2018-07-02 18:00:00'),
    new DateTime('2018-07-04 11:11:00'),
    new DateTime('2018-07-04 20:11:00')
);

$result = array_filter($datetimes, function ($datetime) use ($dates) {
    return in_array(date("Y-m-d", $datetime->getTimestamp()), $dates);
});

var_dump($result);

这将产生以下结果:

array(2) {
  [0]=>
  object(DateTime)#1 (3) {
    ["date"]=>
    string(26) "2018-07-01 12:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(16) "America/New_York"
  }
  [1]=>
  object(DateTime)#2 (3) {
    ["date"]=>
    string(26) "2018-07-01 18:30:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(16) "America/New_York"
  }
}

如果您有大量数据,则可能需要将日期翻转到地图中,其中键为日期,值为true,以便可以执行isset而不是in_array,这会更快。