PHP中如何将指定日期与缺失日期合并到同一数组?
解决方案:包含指定日期的完整月份日期数组
咱们先明确核心需求:你想要的结果是2019年4月1日至月末的所有日期,既要包含原代码找出的"缺失日期",也要把指定的$myDates数组中的日期纳入其中。本质上就是生成这个月份的完整日期列表,下面给你两种实现思路:
方式一:直接生成完整月份日期(简洁高效)
这种方式不需要依赖$myDates做判断,直接生成整个4月的所有日期,一步到位:
$myDates = array("2019-04-01", "2019-04-08"); $fullDates = array(); // 生成起始日期和月末日期 $dateStart = date_create("2019-04-01"); // 精准获取当月最后一天,避免原代码的日期bug $dateEnd = date_create("2019-04-01")->modify('last day of this month'); $interval = new DateInterval('P1D'); // DatePeriod的结束日期是排他的,所以给月末日期加1天才能包含当天 $period = new DatePeriod($dateStart, $interval, $dateEnd->add($interval)); foreach($period as $day) { $fullDates[] = $day->format("Y-m-d"); } echo '<pre>';print_r($fullDates);echo '</pre>';
关键说明:
- 用
modify('last day of this month')替代原代码的mktime写法,避免了原代码中月份参数错误导致的日期计算问题(原代码里mktime(0,0,0,0,1,2019)实际获取的是3月的天数)。 - 给
$dateEnd加一天是因为DatePeriod的结束日期是排他的,这样才能确保包含4月30日。
方式二:基于原代码逻辑修改(保留判断逻辑)
如果你想保留原代码的判断逻辑,只需要在循环结束后,把$myDates合并到结果中,再去重排序即可:
$myDates = array("2019-04-01", "2019-04-08"); $missingDates = array(); // 修复月末日期生成bug $dateStart = date_create("2019-04-01"); $dateEnd = date_create("2019-04-01")->modify('last day of this month'); $interval = new DateInterval('P1D'); $period = new DatePeriod($dateStart, $interval, $dateEnd->add($interval)); foreach($period as $day) { $formatted = $day->format("Y-m-d"); if(!in_array($formatted, $myDates)) $missingDates[] = $formatted; } // 合并数组、去重并按日期排序 $resultDates = array_unique(array_merge($missingDates, $myDates)); sort($resultDates); echo '<pre>';print_r($resultDates);echo '</pre>';
关键说明:
- 先修复原代码的月末日期错误,确保遍历范围正确。
- 用
array_merge合并两个数组,array_unique去除重复项(避免重复添加$myDates中已有的日期),最后sort保证日期按顺序排列。
最终运行结果
两种方式都会输出2019年4月1日到30日的完整日期数组:
Array ( [0] => 2019-04-01 [1] => 2019-04-02 [2] => 2019-04-03 ... [28] => 2019-04-29 [29] => 2019-04-30 )
内容的提问来源于stack exchange,提问作者Agusto Nice
相关产品推荐
相关产品推荐

