
本文介绍如何使用 Laravel Collection 的 sortBy() 方法,基于时间字符串值(如 "9am"、"12pm")而非键进行升序排序,并确保按真实时间顺序(如 9am → 12pm → 1pm → 5pm)排列,避免默认字典序导致的逻辑错误。
本文介绍如何使用 laravel collection 的 `sortby()` 方法,基于时间字符串值(如 "9am"、"12pm")而非键进行升序排序,并确保按真实时间顺序(如 9am → 12pm → 1pm → 5pm)排列,避免默认字典序导致的逻辑错误。
在 Laravel 开发中,常需对扁平化后去重的时间集合(如 ["9am", "10am", "11am", "1pm", "2pm", "5pm", "3pm", "12pm"])进行自然时间排序。但直接调用 $collection->sortBy() 默认按键排序;若按值排序却未正确解析时间语义,易因字符串比较导致 "10am" 排在 "9am" 之前(字典序问题),或 "12pm" 被误判为午夜(未区分 AM/PM)。
正确做法是利用 PHP 内置的 strtotime() 函数将时间字符串统一转换为时间戳,再以此作为排序依据:
$sorted = $c->flatten()->unique()->sortBy(function ($value, $key) {
return strtotime($value);
});
✅ 关键说明:
flatten()展开嵌套结构(如多维数组或集合);unique()去除重复时间值;sortBy()接收闭包,参数$value是当前项的值(如"9am"),$key是其原始键(此处未使用);strtotime()可可靠解析标准英文时间格式(如"9am"、"12pm"、"1:30pm"),返回 Unix 时间戳,天然支持 12 小时制与 AM/PM 语义。
⚠️ 注意事项:
- 确保输入时间格式规范(推荐小写
am/pm,避免空格异常); - 若含非法格式(如
"9:00"无 meridiem),strtotime()返回false,可能导致排序异常——建议前置校验或使用Carbon::parse()做更健壮的解析; - 排序后集合保持原有键名,如需重置索引(连续数字键),可链式调用
->values()->all(); - 如需降序,使用
->sortByDesc(...)或在闭包中返回负时间戳。
最终输出将严格按真实时间顺序排列:
{"0":"9am","1":"10am","2":"11am","14":"12pm","3":"1pm","4":"2pm","10":"3pm","5":"5pm"}
即:上午 → 中午 → 下午 → 晚上,逻辑清晰,符合业务预期。











