【问题标题】:PHP Recursion Function not working as expectedPHP递归函数没有按预期工作
【发布时间】: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;

}

提供给函数的初始$paymentDate2016-01-01

我已经看了好几个小时了,我不明白为什么会这样。这是 Codeigniter 的怪癖还是我完全误解了我的递归逻辑?

【问题讨论】:

  • return day_check($paymentDate, $paymentDay); resursive call 应该返回,否则当你的输出显示时你再次向上走堆栈

标签: php codeigniter recursion


【解决方案1】:

问题在于对逻辑的误解。在您的代码中,从未使用过递归调用结果。

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;

}

还将while 更改为if,因为我们不需要循环。

【讨论】:

  • 严格来说你甚至不需要递归。
  • 谢谢你,我觉得自己太愚蠢了,因为我没有意识到我需要一个 return 语句来调用自己。
猜你喜欢
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
相关资源
最近更新 更多