如何使用Laravel Collection提取多层嵌套recursive_sub中的所有id
用Laravel Collection提取无限嵌套结构中的所有ID
当然可以实现,借助Laravel Collection的方法结合递归逻辑,就能轻松处理这种无限层级嵌套的recursive_sub结构,无需担心层级深度限制。
实现步骤
- 准备数据:先将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));
- 递归提取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());
- 封装为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
相关产品推荐
相关产品推荐

