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

如何使用Laravel Collection提取多层嵌套recursive_sub中的所有id

用Laravel Collection提取无限嵌套结构中的所有ID

当然可以实现,借助Laravel Collection的方法结合递归逻辑,就能轻松处理这种无限层级嵌套的recursive_sub结构,无需担心层级深度限制。

实现步骤

  1. 准备数据:先将JSON格式的嵌套数据转换为Laravel Collection实例:
$json = '{"id": 1,"parent_id": null,"name": "Ch 1","recursive_sub": [{"id": 3,"parent_id": 1,"name": "T 1","recursive_sub": [{"id": 4,"parent_id": 3,"name": "L100","recursive_sub": [{"id": 26,"parent_id": 4,"name": "Line 23","recursive_sub": []}]},{"id": 11,"parent_id": 3,"name": "L2","recursive_sub": []}]},{"id": 10,"parent_id": 1,"name": "T 2","recursive_sub": []}]}';
$data = collect(json_decode($json, true));
  1. 递归提取ID:编写递归函数,结合flatMap和merge方法收集所有层级的ID:
function extractNestedIds($item)
{
    // 收集当前项的ID
    $ids = collect([$item['id']]);

    // 递归处理子项
    if (isset($item['recursive_sub']) && !empty($item['recursive_sub'])) {
        $childIds = collect($item['recursive_sub'])->flatMap('extractNestedIds');
        $ids = $ids->merge($childIds);
    }

    return $ids;
}

// 调用函数获取所有ID
$allIds = extractNestedIds($data->toArray());

// 输出结果:[1, 3, 4, 26, 11, 10]
dd($allIds->all());
  1. 封装为Collection宏(可选):如果需要重复使用,可以将逻辑封装为Collection的宏,调用更便捷:
use Illuminate\Support\Collection;

Collection::macro('extractRecursiveIds', function () {
    return $this->flatMap(function ($item) {
        $ids = collect([$item['id']]);
        
        if (isset($item['recursive_sub']) && !empty($item['recursive_sub'])) {
            $ids = $ids->merge(collect($item['recursive_sub'])->extractRecursiveIds());
        }
        
        return $ids;
    });
});

// 使用宏获取所有ID
$allIds = collect([$data->toArray()])->extractRecursiveIds();
dd($allIds->all());

原理说明

  • flatMap方法会自动将递归返回的嵌套数组扁平化,确保最终结果是一维数组;
  • 递归逻辑会遍历每一层的recursive_sub子项,收集所有层级的id字段,完美适配无限嵌套的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:55:22