You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 '输入时间超出数组范围';
}

修正说明

  1. 改用for循环遍历相邻元素对,每次只检查$arr[$i]和$arr[$i+1]组成的区间,精准定位输入时间所在的唯一区间
  2. 找到匹配项后用break终止循环,确保仅输出一次结果
  3. 优化时间比较逻辑:Y-m-d H:i:s格式的字符串可直接按字典序比较,无需转换为DateTime对象(若需处理复杂时间格式,转换对象更稳妥)
  4. 增加了输入时间等于数组节点、输入时间超出数组范围的处理逻辑

内容的提问来源于stack exchange,提问作者Rzj EM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:40:28