PHP实现数组唯一键值合并求和并返回最大值的方法
问题核心原因
PHP的数组不支持重复的字符串键名,你在array()结构中重复写同名键时,后面的赋值会直接覆盖前面的同键值,这也是你打印数组只能拿到每个国家最后一次赋值的原因——大部分原始数值在数组定义阶段就已经丢失了,后续用任何遍历、求和函数都拿不到被覆盖的数据,自然算不出正确结果。
可行实现方案
首先要避免提前用重复键定义数组丢失数据,原始逐条记录建议用键值对列表的形式存储,再做累加统计,完整代码如下:
<?php // 原始逐条数据存储,不会因为同键丢失值 $rawList = [ ['Canada', 500], ['US', 2], ['Mexico', 40], ['Mexico', 50], ['US', 170], ['Canada', 25], ['Mexico', 5], ['US', 300] ]; // 按国家维度累加数值 $countSum = []; foreach ($rawList as [$nation, $num]) { $countSum[$nation] = isset($countSum[$nation]) ? $countSum[$nation] + $num : $num; } // 按累加值降序排序,取最高的条目 arsort($countSum); $topNation = key($countSum); $total = current($countSum); // 输出预期结果 echo "{$topNation} = {$total}"; ?>
运行上述代码会直接输出:
Canada = 525
可选的array_reduce实现写法
如果想改用array_reduce完成累加逻辑,只需要替换foreach部分的代码即可:
$countSum = array_reduce($rawList, function($res, $row) { [$nation, $num] = $row; $res[$nation] = empty($res[$nation]) ? $num : $res[$nation] + $num; return $res; }, []);
注意:如果你的原始数据是从外部文件、接口读入的逐条键值对,不要直接把每条记录塞进同个数组做键名赋值,要在读入的时候就同步做累加,否则还是会出现同键覆盖丢数据的问题。
内容的提问来源于stack exchange,提问作者Sergio4421
相关产品推荐
相关产品推荐

