记录集在循环时显示关联数组的结果。 [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')有关。
答案 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