提取嵌套数组中所有 data_array 元素并扁平化为单层数组

提取嵌套数组中所有 data_array 元素并扁平化为单层数组

本文介绍如何在 laravel 中不使用显式循环,高效提取多维嵌套结构中指定键(如 `data_array`)的所有子项,并合并为一个一维数组。核心方案基于 laravel 的集合(collection)方法链:`pluck()` + `flatten()`。

在处理类似如下嵌套 JSON 数据时:

{
  "id": "60561bbd1be6cb1972254ec4",
  "main_array": [
    {
      "data_array": [
        { "_id": "6054d5c3dbd0af1cca71b857", "qty": 2000 }
      ]
    },
    {
      "data_array": [
        { "_id": "6054d5c3dbd0af1cca71b859", "qty": 78970 },
        { "_id": "6054d5c3dbd0af1cca71b860", "qty": 978 }
      ]
    }
  ]
}

目标是将所有 main_array 中每个元素的 data_array 合并为一个扁平的一维数组,即:

[
  [ '_id' => '6054d5c3dbd0af1cca71b857', 'qty' => 2000 ],
  [ '_id' => '6054d5c3dbd0af1cca71b859', 'qty' => 78970 ],
  [ '_id' => '6054d5c3dbd0af1cca71b860', 'qty' => 978 ]
]

传统方式需借助 foreach 循环与 array_merge(),代码冗长且可读性弱:

$expectedArray = [];
foreach ($inputs['main_array'] as $item) {
    $expectedArray = array_merge($expectedArray, $item['data_array']);
}

而 Laravel 提供了更优雅、函数式、无副作用的替代方案——利用 Collection 的链式操作:

$flatDataArray = collect($inputs['main_array'])
    ->pluck('data_array')   // 提取每个元素的 'data_array' 值,得到二维数组
    ->flatten(1);           // 扁平化一层(关键!避免深度展开)

✅ pluck(‘data_array’) 返回一个包含多个 data_array 子数组的集合,例如:

Cardify卡片工坊

Cardify卡片工坊

使用Markdown一键生成精美的小红书知识卡片

下载

collect([
  [[ '_id' => '...', 'qty' => 2000 ]],
  [[ '_id' => '...', 'qty' => 78970 ], [ '_id' => '...', 'qty' => 978 ]]
])

✅ flatten(1) 显式指定仅展开一层,确保不会误将对象内部字段(如 _id 字符串)也拆解。若省略参数,默认 flatten() 会递归展开全部层级,可能导致意外行为。

? 补充技巧:若需进一步转换(如统一字段名、过滤空值),可无缝追加方法:

$flatDataArray = collect($inputs['main_array'])
    ->pluck('data_array')
    ->flatten(1)
    ->filter()                    // 过滤 null/empty 子项
    ->map(function ($item) {
        return array_merge($item, ['source' => 'main_array']); // 添加元信息
    })
    ->values();                   // 重置键为数字索引(可选)

⚠️ 注意事项:

  • 确保 $inputs[‘main_array’] 是 PHP 数组(非 JSON 字符串);若为 JSON,请先调用 json_decode($json, true);
  • flatten(1) 中的 1 不可省略或写错,否则对含嵌套对象的结构可能产生非预期结果;
  • 该方案依赖 Laravel 的 Illuminate/Support/Collection,纯 PHP 环境需自行实现或引入第三方库(如 nesbot/carbon 附带的辅助函数不适用,推荐改用原生 array_reduce + array_merge 组合)。

综上,通过 collect()->pluck()->flatten(1) 三步即可替代手动循环,在保持代码简洁性的同时提升可维护性与可测试性,是 Laravel 生态中处理嵌套数组聚合任务的标准实践。

https://www.php.cn/faq/1970808.html

发表回复

Your email address will not be published. Required fields are marked *