【发布时间】:2016-04-08 01:45:46
【问题描述】:
我创建了一个帮助函数来返回当月的第一个有效付款日期。如果是假期(从 db 表中的列表中提取)、星期六或星期日,则该日期无效。在此示例中,2016 年 1 月 1 日是假期。
我在 CodeIgniter 帮助器中创建了这个递归函数,但我看到了非常奇怪的行为。它应该做的是将第 1 天识别为假期,调用自己将第 2 天识别为星期六,再次将第 3 天识别为星期日,然后最终将第 4 天返回为第一个有效日期。
在函数调用自身之后,调用之后的部分将继续在无限循环中运行,除非我插入一个 break;。如果我插入一个中断,我会得到以下输出:
2016-01-01: 1
2016-01-02: 2
2016-01-03: 3
Final: 2016-01-04: 4
Final: 2016-01-04: 4
Final: 2016-01-03: 3
Final: 2016-01-02: 2
在最终返回 2 之前(这是错误的)。
function day_check($paymentDate, $paymentDay = 1) {
$CI =& get_instance();
$dateParts = explode("-", $paymentDate);
$holQ = $CI->db->query("SELECT * FROM holidays WHERE holidayDate = '$paymentDate'");
$holR = $holQ->row();
if ($paymentDay <= 0) {
$paymentDay = 1;
}
while (($holR->holidayDate == $paymentDate) || (date("l", strtotime($paymentDate)) == 'Saturday') || (date("l", strtotime($paymentDate)) == 'Sunday')) {
echo "$paymentDate: $paymentDay <br>";
$refinedDay = $dateParts[2] + 1;
if ($refinedDay < 10) {
$refinedDay = "0" . $refinedDay;
}
$paymentDate = $dateParts[0] . "-" . $dateParts[1] . "-" . ($refinedDay);
$paymentDay = $dateParts[2] + 1;
day_check($paymentDate, $paymentDay);
break;
}
echo "Final: $paymentDate: $paymentDay <br>";
return $paymentDay;
}
提供给函数的初始$paymentDate是2016-01-01
我已经看了好几个小时了,我不明白为什么会这样。这是 Codeigniter 的怪癖还是我完全误解了我的递归逻辑?
【问题讨论】:
-
return day_check($paymentDate, $paymentDay);resursive call 应该返回,否则当你的输出显示时你再次向上走堆栈
标签: php codeigniter recursion