You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel时间集合按值实现时间先后顺序排序方法

问题根因

当前代码仅对多维集合做了扁平化、去重处理,完全没有执行按值排序的逻辑,返回的元素顺序是元素在原集合中第一次出现的顺序;同时unique()会保留元素原有索引,非连续索引在转JSON时会被解析为对象,按键名升序排列,进一步加剧了顺序错乱。
另外如果直接对这类9am/12pm格式的12小时制时间做默认字符串排序,也会出现逻辑错误:字符串按ASCII码逐位对比时,12pm会被判定为小于1pm,和实际时间先后顺序不符。

可直接用的实现代码

两种写法都可以实现按时间从早到晚排序,选一种即可:

写法1:sort自定义比较逻辑

return $c->flatten()
    ->unique()
    ->sort(function ($timeA, $timeB) {
        return strtotime($timeA) - strtotime($timeB);
    })
    ->values();

写法2:sortBy指定排序依据

return $c->flatten()
    ->unique()
    ->sortBy(fn($time) => strtotime($time))
    ->values();
关键注意点
  • 排序逻辑依赖strtotime()识别标准12小时制时间字符串,自动转成可比较的时间戳数值,完全匹配时间先后逻辑,不需要手动写规则转换24小时制
  • 排序后必须调用->values()重置键名:如果不重置为连续数字键,集合转JSON时会被序列化为键值对象,按照原有键的数字大小排序输出,直接覆盖你排好的元素顺序,这也是很多人排序后看起来没生效的核心原因

排序后最终输出的正确顺序为:

["9am","10am","11am","12pm","1pm","2pm","3pm","5pm"]

内容的提问来源于stack exchange,提问作者H Wu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:24:30