2016-01-04 38 views
1

我創建了一個幫助函數來返回該月的第一個有效付款日期。如果是假日(從數據庫表中的列表中拉出),星期六或星期天,則該日無效。在這個例子中,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; 

} 

初始$paymentDate2016-01-01

我一直在看這幾個小時,我不明白爲什麼會這樣。這是Codeigniter的怪癖還是我完全誤解了我的遞歸邏輯?

+1

'return day_check($ paymentDate,$ paymentDay);'resursive call shoud return,else you again walk the stack again as you output shows – cske

回答

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 -> if 
    if (($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; 
    return day_check($paymentDate, $paymentDay); // return! 
    // break; // no need 
    } 


echo "Final: $paymentDate: $paymentDay <br>"; 
return $paymentDay; 

} 

也改變whileif,因爲我們並不需要一個循環那裏。

+0

嚴格地說,你甚至不需要爲此遞歸。 –

+0

謝謝,我沒有意識到我需要一個return語句來調用它自己,我感到非常愚蠢。 – monkeymatrix