
本文介绍一种高效算法,用于从多维数组中剔除所有 rolanID 均被其他供应商完全覆盖的行,并对保留行的 rolanID 进行去重精简,最终输出仅含真正独立数据的净化数组。
本文介绍一种高效算法,用于从多维数组中剔除所有 `rolanid` 均被其他供应商完全覆盖的行,并对保留行的 `rolanid` 进行去重精简,最终输出仅含真正独立数据的净化数组。
在处理供应商与商品 ID(如 rolanID)映射关系的业务场景中,常需识别“冗余供应商”——即其全部商品 ID 已被另一家(或多家)供应商完整包含。此时,该供应商的数据不再提供增量信息,应被过滤;同时,为避免后续重复计算,还需从保留供应商的 rolanID 中剔除已被上游完全覆盖的部分。
核心思路是:基于 ID 的跨行归属分析。我们不逐对比较数组(O(n²) 复杂度高且易漏判),而是先构建一张全局索引表 id → [row_indices],记录每个 rolanID 出现在哪些供应商行中;再对每行遍历其所有 rolanID,求它们共同出现的行索引交集。若交集大小为 1,说明该行是此组 ID 的唯一承载者,不可被替代;否则(交集 ≥ 2),意味着至少存在另一行也包含全部这些 ID,当前行即为冗余,应舍弃。
以下是完整可运行的 PHP 实现:
<?php $test = [
[
"supplier" => "TEST DEPO",
"rolanID" => [123, 234, 456],
"itemCount" => 3
],
[
"supplier" => "ANOTHER DEPO",
"rolanID" => [123, 786, 345],
"itemCount" => 3
],
[
"supplier" => "ROLAN",
"rolanID" => [123, 234],
"itemCount" => 2
]
];
// Step 1: 构建 rolanID 到行索引的反向映射
$idToRows = [];
foreach ($test as $idx => $row) {
foreach ($row['rolanID'] as $id) {
if (!isset($idToRows[$id])) {
$idToRows[$id] = [];
}
$idToRows[$id][] = $idx;
}
}
// Step 2: 对每行计算其 rolanID 的公共行索引交集
$result = [];
foreach ($test as $idx => $row) {
$commonRows = null;
foreach ($row['rolanID'] as $id) {
if (!isset($idToRows[$id])) {
// 若某 ID 未出现在任何行(理论上不应发生),则视为孤立,保留本行
$commonRows = [$idx];
break;
}
if ($commonRows === null) {
$commonRows = $idToRows[$id];
} else {
$commonRows = array_intersect($commonRows, $idToRows[$id]);
}
}
// 若公共行索引仅包含自身,则该行具有不可替代性,保留
if ($commonRows !== null && count($commonRows) === 1 && current($commonRows) === $idx) {
$result[] = $row;
}
}
// 可选:进一步精简保留行中的 rolanID(剔除已被上游完全覆盖的部分)
// 此处按题意要求,仅做行级过滤;若需像示例输出那样精简 rolanID 数组,
// 可在上述循环后追加逻辑:对每个保留行,执行 array_diff($row['rolanID'], 所有前置保留行的 rolanID 并集)
print_r($result);
?>
关键注意事项:
- 该算法时间复杂度为 O(N×M),其中 N 为行数、M 为平均每行
rolanID数量,远优于暴力两两比较; -
array_intersect在内部自动去重,无需额外调用array_unique; - 示例输出中
"ANOTHER DEPO"的rolanID被精简为[786, 345],是因为123已存在于"TEST DEPO"中——但原始问题描述聚焦于行过滤,而非ID 精简。若需实现后者,应在得到$result后,按顺序遍历并累加已知唯一 ID 集合,再对每行rolanID执行array_diff; - 输入数据需确保
rolanID为数值或字符串类型数组,避免混合类型导致array_intersect行为异常。
通过此方法,您可稳健识别并移除语义冗余的供应商数据,为后续聚合、去重或报表生成奠定干净的数据基础。










