PHP中基于固定嵌套键discipline_one对多维数组排序的实现方法
错误原因
- 核心错误为键名拼写不匹配:你的数组中存储二级数据的键是复数
results,但你嵌套调用array_column时使用的是单数result,导致第一层提取结果的数组长度和原数组不一致,触发array_multisort的参数长度校验报错。 - 次要问题为排序方向错误:你需要的是耗时越短排名越靠前,对应应该使用升序
SORT_ASC,而非之前排序分数用的降序SORT_DESC。
解决方案
方案1:修正array_multisort写法
直接修正键名和排序方向即可正常运行:
array_multisort(array_column(array_column($data, 'results'), 'discipline_one'), SORT_ASC, $data);
方案2:使用usort+时间数值化比较(兼容性更强)
如果后续时间数据可能出现大于10分钟的情况,直接按字符串排序会出现逻辑错误(比如10:01的字符串排序结果会小于9:59),推荐把时间转换为总秒数后再比较,PHP7+可通过太空船操作符简化写法:
usort($data, function ($itemA, $itemB) { // 自定义方法把分:秒格式转为总秒数 $parseTime = function ($timeStr) { list($min, $sec) = explode(':', $timeStr); return $min * 60 + $sec; }; return $parseTime($itemA['results']['discipline_one']) <=> $parseTime($itemB['results']['discipline_one']); });
两种方案执行后,$data的id顺序都符合你要求的3, 2, 1, 4。
内容的提问来源于stack exchange,提问作者Jaquarh
相关产品推荐
相关产品推荐

