0

对于第一次运行,我需要使用最后一个 MySQL date 之前六个月的日期$row_recent[0]。对于 1 之后的所有运行,我使用先前的变量来存储先前的日期,然后将日期减少 6 个月。我已经确认第一个 if 测试产生了预期的结果。(MySQL 日期 - 6 个月)。但是,第二个 if 测试$startdate6m由于$previous_6m未初始化而输出为 PHP 默认值。知道为什么它不会识别$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;
}
?>
4

2 回答 2

0

在每次迭代中,您将 $prvious_6m 设置为 $initial6m。在第一次迭代中,定义了 $intial6m,但第二个 if 语句将失败(因为此时 $run_number 为 1,不大于)。在第 2 次迭代中,永远不会设置 $intial6m,因为现在 $run_number > 1 不会进入第一个 if 语句。但是,第二次迭代确实进入了第二个 if 语句。因此,您要么需要将第二个 if 语句更改为包含 1 才能使其正常工作,要么将其放入$previous_6m = $initial6m第一个 if 语句中。

干杯

于 2013-11-08T21:56:52.417 回答
0

您的代码只是矫枉过正。在 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";
}

演示

于 2013-11-09T10:07:06.303 回答