PHP实现:如何匹配数组中输入日期对应的前置最近日期?
问题:匹配输入时间对应的前一个时间节点
时间节点数组
2022-09-23 08:00:00 2022-09-23 08:30:00 2022-09-23 09:00:00 2022-09-23 09:30:00 2022-09-23 10:00:00 2022-09-23 10:30:00 2022-09-23 11:00:00 2022-09-23 13:00:00 2022-09-23 13:30:00 2022-09-23 14:00:00 2022-09-23 14:30:00 2022-09-23 15:00:00 2022-09-23 16:00:00 2022-09-23 16:30:00 2022-09-23 17:00:00 2022-09-23 17:30:00
需求说明
输入一个datetime,若该时间介于数组中某两个连续时间节点之间,输出前一个节点。示例:
Input datetime 2022-09-23 09:12:00, it will use 2022-09-23 09:00:00 Input datetime 2022-09-23 10:29:00, it will use 2022-09-23 10:00:00
当前代码
$final_datetime = array(); $datetime = "2022-09-23 09:12:00"; foreach ($arr as $k => $v) { if ($v == $datetime) { $final_datetime[] = $v; } else { $next1=""; $prev1=""; // Previous Array if (isset($arr[$k-1])) { $prev1 = $arr[$k-1]; } // Next Array if (isset($arr[$k+1])) { $next1 = $arr[$k+1]; } $prev2 = date_create($prev1); $prev = date_format($prev2, 'Y-m-d H:i:s'); $next2 = date_create($next1); $next = date_format($next2, 'Y-m-d H:i:s'); if ($datetime > $prev && $datetime < $next) { echo 'Output : '.$prev.'<br/>'; } else { } } }
当前问题
运行上述代码后输出两行结果:
Output : 2022-09-23 08:30:00 Output : 2022-09-23 09:00:00
期望仅输出正确的那一行:
Output : 2022-09-23 09:00:00
解决方案
问题根源
原代码遍历数组每个元素时,会多次检查不同的前后节点组合,导致同一个输入时间被多个区间匹配到(比如输入09:12:00时,既会被08:30-09:30区间匹配,也会被09:00-09:30区间匹配),从而输出多次。
修正后的代码
// 定义时间节点数组 $arr = [ '2022-09-23 08:00:00', '2022-09-23 08:30:00', '2022-09-23 09:00:00', '2022-09-23 09:30:00', '2022-09-23 10:00:00', '2022-09-23 10:30:00', '2022-09-23 11:00:00', '2022-09-23 13:00:00', '2022-09-23 13:30:00', '2022-09-23 14:00:00', '2022-09-23 14:30:00', '2022-09-23 15:00:00', '2022-09-23 16:00:00', '2022-09-23 16:30:00', '2022-09-23 17:00:00', '2022-09-23 17:30:00' ]; $datetime = "2022-09-23 09:12:00"; $final_datetime = null; // 遍历相邻时间节点对 for ($i = 0; $i < count($arr) - 1; $i++) { $prev = $arr[$i]; $next = $arr[$i + 1]; // Y-m-d H:i:s格式的字符串可直接按字典序比较时间先后 if ($datetime > $prev && $datetime < $next) { $final_datetime = $prev; break; // 找到匹配项后立即终止循环,避免重复输出 } } // 处理输入时间等于数组中某个节点的情况 if ($final_datetime === null && in_array($datetime, $arr)) { $final_datetime = $datetime; } // 输出结果 if ($final_datetime !== null) { echo 'Output : ' . $final_datetime . '<br/>'; } else { echo '输入时间超出数组范围'; }
修正说明
- 改用
for循环遍历相邻元素对,每次只检查$arr[$i]和$arr[$i+1]组成的区间,精准定位输入时间所在的唯一区间 - 找到匹配项后用
break终止循环,确保仅输出一次结果 - 优化时间比较逻辑:
Y-m-d H:i:s格式的字符串可直接按字典序比较,无需转换为DateTime对象(若需处理复杂时间格式,转换对象更稳妥) - 增加了输入时间等于数组节点、输入时间超出数组范围的处理逻辑
内容的提问来源于stack exchange,提问作者Rzj EM
相关产品推荐
相关产品推荐

