PHP:从两个日期之间的数组中获取元素

时间:2014-08-08 17:26:49

标签: php mysql arrays date datetime

是否有这样做的功能?

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

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}

3 个答案:

答案 0 :(得分:1)

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

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

编辑:与使用> =和< =相同,所以要小心第二个日期。此查询不会返回2014-08-06 00:00:01,因为它大于2014-08-06。

答案 1 :(得分:0)

您可以尝试使用数组漫步

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

array_walk($fruits, 'checkDate', $dateToCompare);

答案 2 :(得分:0)

正如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解决方案。