如何基于指定键对PHP多维数组剔除模糊重复项?
处理重复的serviceType-unit键对条目问题
我开发了一个允许用户选择服务类型、单位及对应费率的页面(如“翻译”“按词”“0.05”),但无法阻止用户添加相同serviceType-unit键对但费率不同的条目,因此需要从$_POST数组中剔除这类模糊重复项。
示例数组
$rates = array( array("serviceType" => 1, "unit" => "word", "unitRate" => "0.05000"), array("serviceType" => 2, "unit" => "word", "unitRate" => "0.02500"), array("serviceType" => 3, "unit" => "hour", "unitRate" => "15.0000"), array("serviceType" => 4, "unit" => "hour", "unitRate" => "15.0000"), array("serviceType" => 5, "unit" => "hour", "unitRate" => "25.0000"), >>> array("serviceType" => 1, "unit" => "word", "unitRate" => "0.04000"), array("serviceType" => 6, "unit" => "minute", "unitRate" => "7.0000"), array("serviceType" => 7, "unit" => "minute", "unitRate" => "1.5000"), array("serviceType" => 8, "unit" => "minute", "unitRate" => "0.28330") );
当前实现步骤
- 复制原数组:
$rates_purged = $rates; - 移除
unitRate键值以使用array_unique:for($i = 0; $i < count($rates); $i++) { $unitRates[] = $rates[$i]['unitRate']; unset($rates[$i]['unitRate']); } - 去除重复项:
$ratesUnique = array_unique($rates, SORT_REGULAR); - 找出被移除的子数组:
$diff = array_diff_key($rates, $ratesUnique); - 获取待移除的键并删除对应子数组:
foreach(array_keys($diff) as $key) { $remove = $key; } unset($rates_purged[$remove]);
更优实现方式
当前方法存在两个明显问题:一是多次操作数组效率较低,二是最后一步只能删除最后一个识别到的重复项,若存在多个重复条目会漏处理。更高效简洁的方式是通过一次遍历,用serviceType和unit拼接成唯一键来过滤重复项:
$purifiedRates = []; foreach ($rates as $rate) { // 生成唯一标识键,区分不同的serviceType-unit组合 $uniqueKey = $rate['serviceType'] . '-' . $rate['unit']; // 保留第一次出现的条目,若要保留最后一次出现的,去掉!isset判断即可 if (!isset($purifiedRates[$uniqueKey])) { $purifiedRates[$uniqueKey] = $rate; } } // 可选:重置数组索引为连续数字 $purifiedRates = array_values($purifiedRates);
优势说明
- 效率更高:仅需一次遍历,时间复杂度为O(n),避免了原方法中多次数组拆分、去重、对比的额外开销
- 逻辑清晰:直接通过唯一键判断重复,无需修改原数组结构,代码可读性更强
- 灵活性强:可以自由选择保留首次或末次出现的条目,适配不同业务需求
内容的提问来源于stack exchange,提问作者cheeseus
相关产品推荐
相关产品推荐

