PHP实现:检测配送日期是否在节假日数组并循环更新日期
嘿,这个配送日期避开节假日的需求我太熟了!你之前的问题主要出在日期格式不统一和循环逻辑顺序错误这两点上,我给你梳理下正确的实现方式:
首先明确核心问题:
- 你之前的
do-while一上来就把日期加1,哪怕初始日期本来就不在节假日里,也会被多推一天,完全不符合需求; - 日期格式混乱:初始生成的是
d-m-Y(比如01-05-2018),但循环里又改成了j-F-Y(比如1-May-2018),格式不匹配的话in_array根本检测不到节假日,等于白写!
接下来是修正后的完整代码:
第一步:保留初始配送日期生成逻辑(统一格式)
$currentDate = date('d-m-Y'); $deliveryDate = date('d-m-Y', strtotime($currentDate . '+1 day')); $allHolidays = array('01-05-2018', '02-05-2018', '03-05-2018'); // 库存不足时调整初始配送日期 if ($outOfStock) { $deliveryDate = date('d-m-Y', strtotime($currentDate . '+2 days')); } // ...其他你需要的业务逻辑
第二步:正确的循环检测逻辑(用while最直接)
// 循环检查:只要配送日期在节假日里,就往后推1天 while (in_array($deliveryDate, $allHolidays)) { // 必须保持和初始格式一致的`d-m-Y`,否则检测会失效 $deliveryDate = date('d-m-Y', strtotime($deliveryDate . ' +1 day')); }
如果你偏好do-while的写法(需先判断再进入循环)
// 先判断初始日期是否在节假日,是的话才进入循环调整 if (in_array($deliveryDate, $allHolidays)) { do { $deliveryDate = date('d-m-Y', strtotime($deliveryDate . ' +1 day')); } while (in_array($deliveryDate, $allHolidays)); }
关键注意事项
- 格式统一是灵魂:不管是节假日数组里的日期,还是生成的配送日期,必须用完全一致的格式(比如全程
d-m-Y),否则in_array会因为字符串不匹配返回false; - 循环顺序别搞反:先判断当前日期是否违规,再决定是否调整,避免合法的初始日期被误改。
这样调整后,就能实现「自动跳过所有节假日,找到第一个合法配送日」的需求啦!
内容的提问来源于stack exchange,提问作者Asitis
相关产品推荐
相关产品推荐

