我創建了一個幫助函數來返回該月的第一個有效付款日期。如果是假日(從數據庫表中的列表中拉出),星期六或星期天,則該日無效。在這個例子中,2016年1月1日是假期。PHP遞歸函數不能按預期工作
我已經在CodeIgniter助手中創建了這個遞歸函數,但是我看到了很奇怪的行爲。它應該做的是將第一個標識爲假期,自稱將第二個標識爲星期六,再次將第三個標識爲星期天,然後最終返回第四個作爲第一個有效日期。
函數調用本身後,調用後的部分將繼續在無限循環中運行,除非我插入一個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 shoud return,else you again walk the stack again as you output shows – cske