Laravel 8分组数组按嵌套列排序,sortBy闭包应返回什么值?
Laravel分类分组数组按order字段自定义排序方案
需求梳理
需要保持外层分类的顺序不变,对每个分类下的元素按以下规则排序:
- 按
option_items下的order字段升序排列 order为null的元素统一排在当前分类的末尾- 同一
option_items内的元素顺序不需要调整,相同order的元素保持原有相对顺序
错误点说明
原代码直接对最外层的分类集合调用sortBy,是在对分类本身做排序,不符合「每个分类内部排序」的需求。
正确实现代码
$sorted = collect($originalArray) // 遍历每个分类,仅调整分类内部的元素顺序 ->map(function (array $categoryItems) { return collect($categoryItems) ->sortBy(function (array $item) { // 取第一个option_item的order值(同组order完全一致) $currentOrder = $item['option_items'][0]['order']; // null值替换为最大整型,升序时自动排在末尾 return $currentOrder ?? PHP_INT_MAX; }) // 若需要重置分类下元素的索引为连续数字,可放开下面这行注释 // ->values() ->toArray(); }) ->toArray();
实现逻辑说明
- 外层用
map方法遍历所有分类,不会改变原有分类的顺序和键名 - 内层对单个分类下的元素做排序:
sortBy闭包返回的数值就是排序依据,数值越小排序越靠前 - 空值处理:用
??运算符将null的order替换为PHP_INT_MAX(PHP支持的最大整数值),自然排在所有有有效值的元素之后 - 相同
order的元素会保持原数组中的相对顺序,符合需求
内容的提问来源于stack exchange,提问作者Matt Komarnicki
相关产品推荐
相关产品推荐

