You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:39:04