PHP:按指定星期几生成周期内每周日期的函数无输出问题求助
问题排查与解决方案
我帮你梳理了代码里的几个关键问题,正是这些导致了没有输出,咱们一步步修正:
核心问题分析
- 变量作用域错误:你在函数内部定义的
$q1day1是局部变量,函数外部无法访问,所以print_r($q1day1)自然看不到内容。 - 日期调整逻辑有bug:使用
modify('next Wednesday')会跳过起始日期本身就是周三的情况,而且循环里的周期间隔处理不够精准。 - 结束日期判断遗漏:原代码的
<判断会漏掉刚好等于结束日期的目标星期几。
修正后的代码
function tkcheck($beginnfunc, $endfunc, $daycheck) { $begin = new DateTime($beginnfunc); $end = new DateTime($endfunc); // 定位第一个符合要求的星期几 $currentDate = clone $begin; $currentDate->modify($daycheck); // 如果调整后的日期早于起始日期,说明要往后推一周 if ($currentDate < $begin) { $currentDate->modify('+1 week'); } // 定义周间隔 $weeklyInterval = new DateInterval('P1W'); // 给结束日期加1天,确保包含结束当天(DatePeriod是排他结束) $endInclusive = (clone $end)->modify('+1 day'); $resultDates = []; $period = new DatePeriod($currentDate, $weeklyInterval, $endInclusive); foreach ($period as $date) { $resultDates[] = $date->format('d-m-Y'); } // 返回结果数组,让外部可以接收 return $resultDates; } // 调用函数并接收结果 $q1day1 = tkcheck('2022-02-20','2022-04-01','Wednesday'); print_r($q1day1);
关键修改点说明
- 函数返回结果:让函数直接返回生成的日期数组,外部通过变量接收,彻底解决作用域问题。
- 精准定位首个目标日期:先调整到目标星期几,如果这个日期在起始日期之前,就往后推一周,避免漏掉起始周的目标日。
- 包含结束日期:给结束日期加1天再传入DatePeriod,因为DatePeriod的结束参数是“不包含”的,这样能确保结束当天如果是目标星期几也会被纳入。
- 简化参数:把
next Wednesday改成直接传Wednesday,配合前面的逻辑更可靠,避免重复调整导致的日期跳过。
测试这段代码后,你会得到2022-02-20到2022-04-01之间的所有周三:
Array ( [0] => 23-02-2022 [1] => 02-03-2022 [2] => 09-03-2022 [3] => 16-03-2022 [4] => 23-03-2022 [5] => 30-03-2022 )
内容的提问来源于stack exchange,提问作者GreenXL
相关产品推荐
相关产品推荐

