【问题标题】:PHP: Get elements from an array which are between two datesPHP:从两个日期之间的数组中获取元素
【发布时间】:2014-08-08 17:26:49
【问题描述】:

有这样的功能吗?

例如,如果我有一个这样的数组:

array(
   2014-08-05 10:23:34,
   2014-08-08 13:12:56,
   2014-08-07 08:02:21,
   2014-08-06 11:22:33,
   2014-08-03 6:02:44,
   2014-08-08 10:23:34
);

我想返回 2014-08-03 和 2014-08-06 之间的所有日期。

这些数组中的数据量巨大,甚至可能有数万条数据。我实际上是从数据库中获取所有内容,我想根据访问者选择的时间范围按日期划分数据(如 2 小时、1 天、3 天等)。

如何在不进行大量查询或大量 PHP 函数的情况下做到这一点?

编辑:

根据要求,我将展示图表插件的数据结构(这些值只是简单的示例):

 {x: '2014-08-05 10:23:34', y: 3, data1: 3, data2: 320, data3: 76},
 {x: '2014-08-05 10:23:34', y: 2, data1: 1, data2: 300, data3: 27},
 {x: '2014-08-05 10:23:34', y: 2, data1: 4, data2: 653, data3: 33},
 {x: '2014-08-05 10:23:34', y: 3, data1: 3, data2: 120, data3: 54}

【问题讨论】:

  • 我仍然会使用查询 - 我想性能会好得多,而不是将所有数据读入一个数组,然后过滤它。这不可能吗?
  • 基本上我在这里使用图表。我通过选择 2 个日期为访问者提供了在他们的报告中回顾的功能,而不是我想在这些日期之间在图表中绘制一些数据。当然,当他们只选择 1 天时,我希望他们看到当天更详细的报告,否则让他们更广泛地查看图表。这将需要大量查询来确定它是否只是 1 天,而不是对每 2 小时的值求和等等。
  • 所以您的数据库中获得了所有需要的数据?为什么不创建符合您要求的查询?其他一切都会很慢(如果您有很多用户和数据) - 您可以轻松地在 MySQL 中使用 BETWEEN 运算符。
  • 是的,但您知道我必须决定是一周还是一年,还是一周 1 天或 5 天,然后根据该标准获取所有数据。这似乎是一个很长的查询。没有其他可能的解决方案可以从数据库中获取图表数据吗?
  • 向我们展示图表插件的数据结构。

标签: php mysql arrays date datetime


【解决方案1】:

您可以在 MySQL 中进行排序吗?如果是这样,您可以使用 BETWEEN 运算符:

'SELECT * FROM my_table where date_column BETWEEN '2014-08-03' and '2014-08-06'

编辑:与使用 >= 和

【讨论】:

    【解决方案2】:

    你可以尝试使用数组遍历

    function checkDate(&$item1, $key, $dateToCompare)
    {
        //Your Function to compare and echo or anything else
    }
    
    array_walk($fruits, 'checkDate', $dateToCompare);
    

    【讨论】:

    • array_filter 可能是更好的选择,因为他想退货
    【解决方案3】:

    正如 Pagerange 提到的,最好使用 SQL 查询,但如果您必须在 PHP 中执行此操作,这是一种解决方案:

    // start date chosen by user
    $start_year = 2014;
    $start_month = 8;
    $start_day = 3;
    
    // end date chosen by user
    $end_year = 2014;
    $end_month = 8;
    $end_day = 6;
    
    $dates = array(
       '2014-08-05 10:23:34',
       '2014-08-08 13:12:56',
       '2014-08-07 08:02:21',
       '2014-08-06 11:22:33',
       '2014-08-03 6:02:44',
       '2014-08-08 10:23:34'
    );
    
    $data_in_range = array();
    
    // using FOR instead of FOREACH for performance
    // (assuming zero-based index for $dates array)
    for($i = 0; $i < count($dates); $i++) {
      $year = substr($dates[$i], 0, 4);
      // using intval for values with a leading 0
      $month = intval(substr($dates[$i], 5, 2));
      $day = intval(substr($dates[$i], 8, 2));
    
      if ($year >= $start_year && $year <= $end_year) {
        if ($month >= $start_month && $month <= $end_month) {
          // depending on your definition of 'between' (MySQL
          // includes the boundaries), you may want
          // this conditional to read > && <
          if ($day >= $start_day && $day <= $end_day) {
            $data_in_range[] = $dates[$i];
          }
        }
      }
    }
    
    print_r($data_in_range);
    

    我不推荐这个答案,而是提供一个 PHP 解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-23
      • 2020-03-02
      • 2013-10-19
      • 2020-06-08
      • 2019-05-07
      • 1970-01-01
      • 2010-12-03
      • 2018-01-11
      相关资源
      最近更新 更多