多维数组行过滤:移除重复值及无唯一值的行
处理PHP多维数组的重复rolanID过滤方案
先把需求明确拆解:
- 移除所有
rolanID在其他供应商条目中也存在的行 - 对于仅属于某一个供应商的
rolanID,保留该供应商的条目,若同一供应商下该ID有多行则累加itemCount - 最终数组仅保留各供应商的独有
rolanID及合并后的itemCount
先给个输入示例方便对照:
$input = [ ['supplier' => 'A', 'rolanID' => 101, 'itemCount' => 2], ['supplier' => 'A', 'rolanID' => 102, 'itemCount' => 3], ['supplier' => 'B', 'rolanID' => 101, 'itemCount' => 1], ['supplier' => 'B', 'rolanID' => 103, 'itemCount' => 4], ['supplier' => 'C', 'rolanID' => 104, 'itemCount' => 5], ['supplier' => 'C', 'rolanID' => 104, 'itemCount' => 2], // 同一供应商同一ID的重复行 ];
这里rolanID=101跨A、B两个供应商,所以对应的两行都要删除;A的102、B的103、C的104是各自独有的ID,C的104两行要合并itemCount为7。
实现代码
// 第一步:统计每个rolanID对应的供应商集合,判断是否跨供应商重复 $rolanSupplierMap = []; foreach ($input as $item) { $id = $item['rolanID']; if (!isset($rolanSupplierMap[$id])) { $rolanSupplierMap[$id] = []; } // 用数组键存供应商,自动去重(同一供应商多次出现同一ID只记一次) $rolanSupplierMap[$id][$item['supplier']] = true; } // 第二步:筛选有效条目并合并itemCount $result = []; foreach ($input as $item) { $id = $item['rolanID']; // 仅保留当前供应商独有的rolanID if (count($rolanSupplierMap[$id]) === 1 && array_key_exists($item['supplier'], $rolanSupplierMap[$id])) { $supplier = $item['supplier']; // 同一供应商同一ID累加itemCount if (!isset($result[$supplier][$id])) { $result[$supplier][$id] = [ 'supplier' => $supplier, 'rolanID' => $id, 'itemCount' => 0 ]; } $result[$supplier][$id]['itemCount'] += $item['itemCount']; } } // 把分组后的二维数组转成和输入一致的一维数组 $result = array_merge(...array_values($result)); // 输出结果 print_r($result);
代码说明
- 统计ID的供应商分布:通过一次遍历,给每个
rolanID记录所有出现过的供应商,快速判断该ID是否跨供应商重复。 - 筛选合并有效数据:再次遍历输入,只保留独属于当前供应商的ID,同时对同一供应商同一ID的
itemCount做累加,避免同一供应商下同一ID出现多条。 - 格式统一:最后把按供应商分组的数组转成一维,和输入格式保持一致。
运行示例输入后,输出结果为:
Array ( [0] => Array ( [supplier] => A [rolanID] => 102 [itemCount] => 3 ) [1] => Array ( [supplier] => B [rolanID] => 103 [itemCount] => 4 ) [2] => Array ( [supplier] => C [rolanID] => 104 [itemCount] => 7 ) )
这个方案能覆盖所有场景,不管供应商数量多少、同一供应商下同一ID重复多少次,都能正确过滤和合并。
内容的提问来源于stack exchange,提问作者Soyas
相关产品推荐
相关产品推荐

