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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:30:47