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
相关产品推荐
相关产品推荐

