PHP实现数组每个重复值仅删除一次后计算剩余元素总和的问题
问题解答
原代码正确性判断
你写的代码可以正确得到预期的24的结果,但存在两个明显问题:
- 逻辑晦涩:通过将待删除值转成负数合并后求和的实现方式可读性差,后期维护成本高
- 扩展性差:需要提前手动把所有要删除的重复值写入
$duplicate数组,一旦数组新增其他重复值就无法自动处理
更简洁高效的实现方案
通用方案(自动识别所有重复值,各删1个再求和)
无需提前指定重复值,适配任意数组内容,时间复杂度为O(n):
$array = ['+5', '+5', '+3', '+3', '+3', '+3', '+5', '+5']; // 统计每个值的出现次数 $countMap = array_count_values($array); $total = 0; foreach ($countMap as $valStr => $occurTimes) { // 出现2次及以上的删除1个,否则保留全部 $keepTimes = $occurTimes >= 2 ? $occurTimes - 1 : $occurTimes; $total += intval($valStr) * $keepTimes; } var_export($total); // 输出 24
指定删除方案(仅删除指定值各1个)
如果你的需求就是固定删除指定值各1个,也可以简化原逻辑,去掉冗余的正则、数组合并操作:
$array = ['+5', '+5', '+3', '+3', '+3', '+3', '+5', '+5']; // 键为待删除的值,值为需要删除的个数 $deleteConfig = [ '+5' => 1, '+3' => 1 ]; // 先算原数组总和 $total = array_sum(array_map('intval', $array)); // 减去要删除的值的总和 foreach ($deleteConfig as $valStr => $deleteNum) { $total -= intval($valStr) * $deleteNum; } var_export($total); // 输出 24
内容的提问来源于stack exchange,提问作者Ulta Nagenki
相关产品推荐
相关产品推荐

