如何按带斜杠的OpenDate字段对JSON数组排序?已尝试多种方法未解决
针对JSON数组按OpenDate字段排序失效的解决方案
嘿,我之前也踩过PHP数组日期排序的坑,咱们来一步步排查问题:
首先排查核心问题点
- 日期格式解析问题:
strtotime()对非标准日期格式的兼容性很差,比如如果你的OpenDate是DD/MM/YYYY这种格式,它会错误识别成MM/DD/YYYY,导致排序逻辑完全错乱。这时候一定要用DateTime::createFromFormat()明确指定日期格式,避免解析歧义。 - 字段存在性与拼写检查:先确认
$objJobs里的每个元素都确实包含OpenDate键,有没有大小写错误(比如写成opendate或者openDate)?可以用var_dump($objJobs[0])打印第一个元素的结构,验证字段是否存在。 - 数组转换的冗余与正确性:你的转换代码可以简化成
$objJobs = $array[2] ?? [];,同时要确认$array[2]本身就是包含目标数据的数组,没有嵌套更深的层级。
修正后的排序代码(容错性更强)
// 先确保目标数组存在 $objJobs = $array[2] ?? []; // 自定义排序逻辑,用DateTime类处理日期解析 usort($objJobs, function ($a, $b) { // 处理字段缺失的情况 if (!isset($a['OpenDate'], $b['OpenDate'])) { return 0; // 可根据需求调整,比如把缺失的放到最后 } // 替换成你的OpenDate实际格式,比如'Y-m-d H:i:s'或者'd/m/Y' $dateFormat = 'Y-m-d'; $dateA = DateTime::createFromFormat($dateFormat, $a['OpenDate']); $dateB = DateTime::createFromFormat($dateFormat, $b['OpenDate']); // 处理日期解析失败的情况 if (!$dateA) { return 1; // 解析失败的放到后面,或者0保持原位置 } if (!$dateB) { return -1; } // 按时间戳差值排序,正序排列;如果要倒序,反过来减即可 return $dateA->getTimestamp() - $dateB->getTimestamp(); });
验证步骤
- 排序前先打印
$objJobs的原始数据,确认每个元素的OpenDate值和格式 - 运行排序代码后,再次打印
$objJobs,对比日期顺序是否符合预期 - 如果还是不对,在排序回调里打印
$dateA->getTimestamp()和$dateB->getTimestamp(),看时间戳是否正确生成
内容的提问来源于stack exchange,提问作者Natie Rautenbach
相关产品推荐
相关产品推荐

