
本文介绍如何使用 Laravel Collection 的 sortBy() 方法,基于时间字符串值(如 "9am"、"12pm")而非键进行自然时序排序,并解决因原始键混乱导致的顺序错乱问题。
本文介绍如何使用 laravel collection 的 `sortby()` 方法,基于时间字符串值(如 "9am"、"12pm")而非键进行自然时序排序,并解决因原始键混乱导致的顺序错乱问题。
在 Laravel 开发中,常需对扁平化后去重的时间集合(如 ["9am", "10am", "11am", "1pm", "2pm", "5pm", "3pm", "12pm"])进行严格按 12 小时制时间逻辑排序。直接调用 sortBy() 默认按键排序,而 sortBy('value') 在关联数组中无效——因为集合中每个项是纯字符串值,无 value 属性。
正确做法是使用闭包回调,将时间字符串转换为可比较的时间戳:
$times = $c->flatten()->unique(); $sorted = $times->sortBy(fn($time) => strtotime($time));
✅ strtotime() 能可靠解析 "9am"、"12pm"、"1pm" 等格式,自动转换为 Unix 时间戳(如 "12pm" → 12:00:00,"1pm" → 13:00:00),从而实现跨午前/午后正确排序。
⚠️ 注意事项:
- 确保时间字符串格式规范(推荐小写
am/pm,空格可省略;"9am"✅,"9 AM"❌ 可能失败,建议预处理标准化); -
sortBy()返回新集合,原集合不变;如需重置键为连续数字,链式调用->values()->all(); - 若存在非法时间(如
"invalid"),strtotime()返回false,会导致排序异常,建议先过滤:$times->filter(fn($t) => strtotime($t) !== false)。
最终结果将严格按时间先后排列:
["9am", "10am", "11am", "12pm", "1pm", "2pm", "3pm", "5pm"]
该方法简洁、可靠,无需手动映射或自定义比较器,充分利用 PHP 内置时间解析能力,是处理前端传入或数据库导出的非结构化时间数据的理想方案。











