
本文介绍如何将包含多个供应商和零件信息的二维数组,转换为以供应商为键、零件id数组为值的嵌套结构,适用于数据聚合与报表生成场景。
本文介绍如何将包含多个供应商和零件信息的二维数组,转换为以供应商为键、零件id数组为值的嵌套结构,适用于数据聚合与报表生成场景。
在实际开发中(尤其是处理采购、库存或供应链数据时),我们常需对原始扁平化记录进行分组归集。例如,给定一个由数据库查询或API返回的关联数组,每项包含 part_id、supplier 和 quantity 字段,目标是按供应商名称聚合所有对应的零件ID,形成层级清晰的结构。
核心思路是:遍历原始数组,以 supplier 为键动态构建新数组,并将每个 part_id 追加至对应供应商下的 productID 子数组中。该过程无需预先定义键名,具备良好的扩展性与鲁棒性。
以下是可直接运行的 PHP 示例代码:
<?php
// 原始多维数组(模拟从数据库或循环中获取的数据)
$oldarr = [
['part_id' => 2338117, 'supplier' => 'COOLDRIVE DISTRIBUTION', 'quantity' => 12],
['part_id' => 2338117, 'supplier' => 'ROLAN', 'quantity' => 20],
['part_id' => 51154, 'supplier' => 'ROLAN', 'quantity' => 20],
];
// 初始化空数组用于存储结果
$newarr = [];
// 遍历原始数组,按 supplier 分组并收集 part_id
foreach ($oldarr as $item) {
$supplier = $item['supplier'];
$partId = $item['part_id'];
// 确保目标子数组存在,然后追加 part_id
if (!isset($newarr[$supplier]['productID'])) {
$newarr[$supplier]['productID'] = [];
}
$newarr[$supplier]['productID'][] = $partId;
}
// 输出结果(验证结构是否符合预期)
print_r($newarr);
?>执行后将输出:
Array
(
[COOLDRIVE DISTRIBUTION] => Array
(
[productID] => Array
(
[0] => 2338117
)
)
[ROLAN] => Array
(
[productID] => Array
(
[0] => 2338117
[1] => 51154
)
)
)✅ 注意事项与优化建议:
- 代码中使用
isset()显式检查子数组是否存在,避免未定义索引警告(尤其在严格错误报告环境下); - 若需去重(如同一供应商多次出现相同
part_id),可在追加前使用!in_array($partId, $newarr[$supplier]['productID'])判断; - 如需保持插入顺序或进一步排序,可在循环结束后对各
productID数组调用array_unique()和sort(); - 在现代 PHP(≥7.4)中,也可结合
array_reduce()实现函数式写法,但 foreach 方案更直观、易调试、性能稳定。
该方法简洁高效,适用于中小型数据集;若处理海量数据(如万级条目),建议结合数据库 GROUP BY supplier + GROUP_CONCAT(part_id) 预聚合,减少 PHP 层计算压力。













