如何将日期间隔(日期范围)结果附加到PHP数组中?

时间:2019-01-19 03:49:23

标签: php

记录集在循环时显示关联数组的结果。 [date] = startDate,[dateLast] = $ endDate

结果:

2019-01-19 - 2019-01-22
2019-01-19 - 2019-01-23
2019-01-20 - 2019-01-25
2019-01-22 - 2019-01-25
2019-01-27 - 2019-01-30
2019-01-29 - 2019-01-31
2019-02-01 - 2019-02-05

每行指定预订的开始和结束日期。我想生成一个用逗号分隔的唯一日期列表,以便在日历中使用。

循环相同的记录集,我试图创建一个包含所有实际日期(开始,结束和之间)的数组。

在循环记录集时,我首先使用第一个开始和结束日期,并将它们放入数组中。 然后使用array_push用每个记录的开始和结束日期更新该数组。然后使用array_unique仅保留唯一值。

        <?php
    $wa_startindex = 0;
    while(!$reservALL->atEnd()) {
      $wa_startindex = $reservALL->Index;
    ?>

            <?php   
            $startDate = ($reservALL->getColumnVal("date")); 
            $endDate = ($reservALL->getColumnVal("dateLast")); 

            $format = "Y-m-d";

            $begin = new DateTime($startDate);
            $end = new DateTime($endDate);

            $interval = new DateInterval('P1D'); // 1 Day
            $dateRange = new DatePeriod($begin, $interval, $end);

            $range = [];
            foreach ($dateRange as $date) {
                $range[] = $date->format($format);
                $result = array_unique($range, SORT_REGULAR);
            }
            ?>
            <?php
      $reservALL->moveNext();
    }
    $reservALL->moveFirst(); //return RS to first record
    unset($wa_startindex);
    unset($wa_repeatcount);
    ?>

但是它似乎忽略了许多记录以及显示重复的日期。因为密钥保存在array_unique中,可以解释重复的记录。

无论如何,print_r($ result)的结果显示以下内容不是所期望的。它有效,但仅显示最后一个记录,而不附加每个记录的开始,结束和中间日期。

Array
(
  [0] => 2019-02-01
  [1] => 2019-02-02
  [2] => 2019-02-03
  [3] => 2019-02-04
)

问题是该数组如何与array_push附加在一起?似乎是在写作而不是附加。

更新以显示最终正确的代码:

<?php
    $wa_startindex = 0;
    $range = []; // declare Arry
    while(!$reservALL->atEnd()) {
      $wa_startindex = $reservALL->Index;
?>

            <?php   
            $startDate = ($reservALL->getColumnVal("date")); 
            $endDate = ($reservALL->getColumnVal("dateLast")); 

            $format = "m-d-Y";

            $begin = new DateTime($startDate);
            $end = new DateTime($endDate);

            $interval = new DateInterval('P1D'); // 1 Day
            $dateRange = new DatePeriod($begin, $interval, $end);

            foreach ($dateRange as $date) {
                $range[] = $date->format($format);
            }
         array_push($range, $result);
            ?>
<?php
      $reservALL->moveNext();
    }
$result = array_filter(array_unique($range)); // array_filter removes any empty records
    $reservALL->moveFirst(); //return RS to first record
    unset($wa_startindex);
    unset($wa_repeatcount);
?>

在未应用array_filter()的情况下,只有一条空记录:

[0] => 01-10-2019
[1] => 01-11-2019
[2] => 01-12-2019
[3] => 01-13-2019
[4] => 
[15] => 01-19-2019
[16] => 01-20-2019
[17] => 01-21-2019

今天的日期为“ 01-19-2019”,表明它可能与DateInterval('P1D')有关。

1 个答案:

答案 0 :(得分:1)

您的第一个问题是,您在循环的每一遍上都用以下行重写$range

$range = [];

您应该将该行移到循环之外。即

$wa_startindex = 0;
$range = [];
while(!$reservALL->atEnd()) {
    ...

您还存在将数据推送到$range的问题。您正在将数组而不是单个值推入其中。更改此代码:

foreach ($dateRange as $date) {
    $range[] = $date->format($format);
    $result = array_unique($range, SORT_REGULAR);
}
array_push($range, $result);

foreach ($dateRange as $date) {
    $range[] = $date->format($format);
}

,然后在循环结束时,调用array_unique

    ...
}
$range = array_unique($range);
$reservALL->moveFirst(); //return RS to first record