PHP按d/m/Y H:i:s格式StartTime对数组排序失败求助
问题分析与解决
你的代码排序失效的核心原因是:错误地将DateTime对象传入strtotime()函数——这个函数需要接收日期字符串而非对象,虽然PHP会自动将DateTime转为字符串,但这种操作多余且可能在解析失败时导致错误(比如createFromFormat返回false时,strtotime(false)会得到0,导致所有元素排序值相同)。
以下是两种正确的实现方式:
方法一:直接比较DateTime对象
PHP的DateTime对象支持太空船运算符(<=>)直接比较,写法简洁且直观:
$client = [ [ 'LessonId' => 1, 'StartTime' => '20/11/2022 10:30:00', 'EndTime' => '20/11/2022 11:30:00', 'LessonName' => 'Dance', ], [ 'LessonId' => 2, 'StartTime' => '20/11/2022 09:30:00', 'EndTime' => '20/11/2022 10:30:00', 'LessonName' => 'Dance', ], ]; usort($client, function ($a, $b) { $dateA = \DateTime::createFromFormat('d/m/Y H:i:s', $a['StartTime']); $dateB = \DateTime::createFromFormat('d/m/Y H:i:s', $b['StartTime']); // 可选:处理日期解析失败的情况,将无效日期排到末尾 if (!$dateA) return 1; if (!$dateB) return -1; return $dateA <=> $dateB; });
方法二:使用DateTime的时间戳比较
如果你更习惯用Unix时间戳排序,可以调用getTimestamp()方法获取正确的时间戳,替代多余的strtotime():
usort($client, function ($a, $b) { $dateA = \DateTime::createFromFormat('d/m/Y H:i:s', $a['StartTime']); $dateB = \DateTime::createFromFormat('d/m/Y H:i:s', $b['StartTime']); $pos_a = $dateA ? $dateA->getTimestamp() : PHP_INT_MAX; $pos_b = $dateB ? $dateB->getTimestamp() : PHP_INT_MAX; return $pos_a <=> $pos_b; });
总结:不需要用strtotime()配合createFromFormat,createFromFormat已经完成了字符串到日期对象的解析,直接用对象或其时间戳即可完成排序。
内容的提问来源于stack exchange,提问作者Jorn Reed
相关产品推荐
相关产品推荐

