
本文介绍如何使用 Laravel Collection 的 sortBy() 方法,结合 strtotime() 将包含 "am/pm" 格式的时间字符串(如 "9am"、"12pm"、"3pm")按真实时间顺序升序排列,解决键值错位导致的默认索引排序失效问题。
本文介绍如何使用 laravel collection 的 `sortby()` 方法,结合 `strtotime()` 将包含 "am/pm" 格式的时间字符串(如 "9am"、"12pm"、"3pm")按真实时间顺序升序排列,解决键值错位导致的默认索引排序失效问题。
在 Laravel 开发中,当我们调用 $c->flatten()->unique() 处理时间数据时,得到的集合往往保留原始键名(如 "10":"3pm"、"14":"12pm"),这会导致直接使用 sortBy() 默认按键排序或无法正确解析语义时间。例如:
$c = collect(["9am", "10am", "11am", "1pm", "2pm", "5pm", "3pm", "12pm"]);
$flattenedUnique = $c->flatten()->unique();
// 输出:{"0":"9am","1":"10am","2":"11am","3":"1pm","4":"2pm","5":"5pm","10":"3pm","14":"12pm"}
此时若仅用 $flattenedUnique->sortBy(),Laravel 会尝试按字符串字典序排序(如 "10am" 排在 "9am" 前),结果错误;而 sortBy('value') 也不适用——因为该方法仅适用于对象或关联数组中存在明确 'value' 键的情形。
✅ 正确做法是:传入闭包,对每个元素的值(即时间字符串)调用 strtotime() 转为时间戳,再依此排序:
$sorted = $flattenedUnique->sortBy(function ($timeString) {
return strtotime($timeString);
})->values(); // ->values() 可选:重置键为连续数字索引(0,1,2...)
strtotime() 能智能解析常见 am/pm 时间格式(如 "9am" → 09:00:00,"12pm" → 12:00:00,"1pm" → 13:00:00),确保 "12pm" 正确排在 "11am" 之后、"1pm" 之前。
⚠️ 注意事项:
- 输入时间格式需符合 PHP
strtotime()支持规范(推荐使用H:i A或简写如"9am"、"12pm";避免"9:00am"等不标准写法); - 若存在非法时间(如
"25am"),strtotime()返回false,可能导致排序异常,建议前置校验; -
sortBy()返回新集合,原集合不变;如需就地修改,可链式调用->all()或赋值覆盖; - 排序后若需重置键名(消除稀疏索引),务必追加
->values()。
最终结果将严格按真实时间升序排列:
["9am","10am","11am","12pm","1pm","2pm","3pm","5pm"]
这一方案简洁、可靠,无需手动映射或正则转换,充分利用了 PHP 原生时间解析能力与 Laravel Collection 的函数式编程优势。











