【问题标题】:Filtering out records from a datetime array in php从php中的日期时间数组中过滤掉记录
【发布时间】:2018-08-05 00:28:23
【问题描述】:

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

  • 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
有没有一种干净的编码方式?

【问题讨论】:

    标签: php datetime


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以将 array_filter 与 in_array、date 和 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,这样会更快。

      【讨论】:

      • 如果 $datetimes 是我要过滤的日期时间记录的初始数组,$result 是我保留的日期时间记录的最终数组,$dates 是我正在使用的日期数组作为过滤日期时间记录的标准,$datetime 是什么?
      • 当您使用 array_filter 遍历数组时,您作为参数传递的函数将在第一个参数中传递数组的每个元素。也就是说,$datetime 是正在测试的 $datetimes 的元素,以匹配或不匹配 $dates 中的日期之一。
      • 这对我不起作用,我无法用您的方法消除代码中的错误:$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) { return in_array(date("Y-m-d", strtotime($datetime)), $dates); });
      • @JeffSayers 它不起作用的原因是因为您使用的是 DateTime 对象。根据您的问题,我假设您的日期时间字符串格式为(“Y-m-d H:is”)。您应该更新您的问题以指定格式。
      • @JeffSayers 在函数之前我还缺少use ($dates)。我已经用您评论中的数据更新了我的答案。如果你运行它,你会发现它有效。
      猜你喜欢
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多