2016-01-04 39 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