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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:27:03