对于第一次运行,我需要使用最后一个MySQL日期$row_recent[0]
之前六个月的日期。对于 1 之后的所有运行,我使用前一个变量来存储上一个日期,然后将日期减少 6 个月。我已经确认第一个 if 测试会产生预期的结果。(MySQL 日期 - 6 个月)。但是,第二个 if 测试输出$startdate6m
为 PHP 默认值,因为$previous_6m
未初始化。知道为什么它不会识别$previous_6m = $initial6m
吗?
<?php
$run_number = 0;
while ($run_number < 15) {
$run_number++;
if($run_number == 1){
if ($month <= 06){
$year6m = date("Y", strtotime($row_recent[0]))-1;
$month6m = str_pad((12-(6-date("m", strtotime($row_recent[0])))), 2, "0", STR_PAD_LEFT);
$startdate6m = "'".$year6m."-".$month6m."-01'";
$end_date = $startdate6m;
$initial6m = $startdate6m;
} else{
$year6m = date("Y", strtotime($row_recent[0]));
$month6m = str_pad(date("m", strtotime($row_recent[0]))-6, 2, "0", STR_PAD_LEFT);
$startdate6m = "'".$year6m."-".$month6m."-01'";
$end_date = $startdate6m;
$initial6m = $startdate6m;
}
}
$previous_6m = $initial6m;
if($run_number > 1){
# 6 Month
# Decrement date by 6 months
$month6m = date("m", strtotime($previous_6m));
if ($month6m <= 06){
$year6m = date("Y", strtotime($previous_6m))-1;
$month6m = str_pad((12-(6-date("m", strtotime($previous_6m)))), 2, "0", STR_PAD_LEFT);
$startdate6m = "'".$year6m."-".$month6m."-01'";
$end_date = $startdate6m;
} else{
$year6m = date("Y", strtotime($previous_6m));
$month6m = str_pad(date("m", strtotime($previous_6m))-6, 2, "0", STR_PAD_LEFT);
$startdate6m = "'".$year6m."-".$month6m."-01'";
$end_date = $startdate6m;
}
}
$previous_6m = $startdate6m;
}
?>
你的代码只是矫枉过正。所有这些代码,在 while 循环中,都可以替换为几行,例如:
$previous_6m = new DateTime($row_recent[0]);
$previous_6m->modify('first day of this month');
$run_number = 0;
while ($run_number < 15) {
$run_number++;
$previous_6m->modify('-6 month');
# do something with your new date
echo '$previous_6m = ', $previous_6m->format('Y-m-d'), "'n";
}
演示。
在每次迭代中,您将$prvious_6m设置为$initial 6m。在第一次迭代中,定义了 $intial 6m,但第二个 if 语句将失败(因为此时 $run_number 为 1,而不是大于)。在迭代 #2 上,永远不会设置 $intial 6m,因为您不会进入第一个 if 语句,因为现在 $run_number> 1。但是,第二次迭代确实进入了第二个 if 语句。因此,您要么需要将第二个 if 语句更改为包含 1 才能正常工作,要么$previous_6m = $initial6m
放在第一个 if 语句中。
干杯