
本文介绍如何在php中高效筛选出日期时间字段与目标时间相差不超过10分钟的数组元素,并构建指定格式的二维结果数组。
本文介绍如何在php中高效筛选出日期时间字段与目标时间相差不超过10分钟的数组元素,并构建指定格式的二维结果数组。
在处理文件元数据或日志记录时,常需根据时间精度(如±10分钟)进行条件过滤。本例中,$obj['files'] 是一个二维数组,每项 $file 包含文件名(索引 0)和字符串格式的日期时间(索引 6),而 $prop['created_date'] 是一个 IP_DateTime 对象(来自自定义或第三方库),其 date 属性为类似 "2022-04-25 03:38:15.000000" 的微秒级时间字符串。
⚠️ 注意:直接对 IP_DateTime 对象调用 strtotime() 会失败(返回 false),必须先提取其标准化的 date 字符串并截断微秒部分,否则时间计算将不准确。同时,array_push($result, $file) 会导致整个原始 $file 数组被推入结果,而非仅 [name, datetime] 二元子数组——这与需求结构不符。
以下是推荐的健壮实现:
$createDate = $prop['created_date'];
// 安全提取并标准化 IP_DateTime 对象的时间字符串(去除微秒,适配 strtotime)
if ($createDate instanceof IP_DateTime) {
$createDateTimeStr = preg_replace('/\.\d{6}/', '', $createDate->date); // 移除 .000000
} else {
$createDateTimeStr = (string)$createDate;
}
$result = [];
foreach ($obj['files'] as $file) {
$fileName = $file[0] ?? '';
$fileDateTimeStr = $file[6] ?? '';
// 跳过空或无效时间字符串
if (!$fileName || !$fileDateTimeStr || !strtotime($fileDateTimeStr) || !strtotime($createDateTimeStr)) {
continue;
}
$fileTimestamp = strtotime($fileDateTimeStr);
$createTimestamp = strtotime($createDateTimeStr);
$diffSeconds = abs($fileTimestamp - $createTimestamp);
$tenMinutes = 600; // 10 × 60 秒
if ($diffSeconds < $tenMinutes) {
$result[] = [$fileName, $fileDateTimeStr]; // 直接追加 [name, datetime] 子数组
}
}
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);✅ 关键优化说明:
- 使用
$result[] = [...]替代array_push(),语义清晰且天然支持二维数组追加; - 显式处理
IP_DateTime对象,通过正则移除微秒部分,确保strtotime()解析成功; - 添加空值与时间有效性校验,避免
strtotime(false)导致逻辑错误; - 启用
JSON_UNESCAPED_UNICODE确保中文等字符正常输出(如文件名含非ASCII字符); - 不使用
break(原代码误加),以保留所有符合条件的匹配项(符合“More than 1 results”需求)。
最终输出为标准 JSON 格式的二维数组,例如:
[["20220407_10_22_30_L100.SVL","2022-04-25 03:42:05"],["20220407_10_23_15_L101.SVL","2022-04-25 03:35:50"]]
该方案兼顾准确性、可读性与鲁棒性,适用于生产环境中的时间敏感型数据过滤场景。

















