
本文介绍如何将原始的关联数组按 supplier 字段分组,将相同供应商下的 part_id 聚合为 productid 数组,最终生成嵌套结构清晰、可直接用于业务逻辑的规范化数组。
本文介绍如何将原始的关联数组按 supplier 字段分组,将相同供应商下的 part_id 聚合为 productid 数组,最终生成嵌套结构清晰、可直接用于业务逻辑的规范化数组。
在实际开发中(尤其是 PHP 后端处理采购、库存或供应商数据时),我们常遇到需对多维数组进行“按字段分组 + 值聚合”的需求。例如,原始数据是一组扁平的订单明细,每个元素包含 part_id、supplier 和 quantity;而业务前端或后续统计模块需要的是以供应商为键、其对应所有零件 ID 列表为值的嵌套结构。
以下是一个简洁、高效且符合 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'];
// 确保该供应商键存在,且 productID 子数组已初始化
if (!isset($newarr[$supplier]['productID'])) {
$newarr[$supplier]['productID'] = [];
}
// 追加 part_id(自动索引)
$newarr[$supplier]['productID'][] = $partId;
}
print_r($newarr);
?>输出结果:
Array
(
[COOLDRIVE DISTRIBUTION] => Array
(
[productID] => Array
(
[0] => 2338117
)
)
[ROLAN] => Array
(
[productID] => Array
(
[0] => 2338117
[1] => 51154
)
)
)✅ 关键说明:
- 使用
foreach遍历避免键冲突与索引错位,语义清晰、性能稳定; - 显式检查
isset()可防止未定义索引警告(尤其在严格模式或E_NOTICE开启时); - 不依赖
array_key_exists()或冗余初始化,兼顾简洁性与健壮性; - 若需去重(如同一供应商多次出现相同
part_id),可在追加前添加!in_array($partId, $newarr[$supplier]['productID'])判断; - 如需兼容 PHP 7.4+,亦可使用空合并运算符简化:
$newarr[$supplier]['productID'] ??= [];,再执行$newarr[$supplier]['productID'][] = $partId;
该方法无需额外扩展(如 array_reduce),零第三方依赖,适用于 Laravel、CodeIgniter 等主流框架的模型层或服务类中,是处理此类数据规整任务的标准范式。

















