PHP不区分大小写分组一维数组并求和代码逻辑解析求助
不区分大小写分组关联数组求和的PHP代码解析
先看你提供的完整代码:
function add_array_vals($arr) { $sums = []; foreach ( $arr as $key => $val ) { $key = strtoupper($key); if ( !isset($sums[$key]) ) { $sums[$key] = 0; } $sums[$key] = ( $sums[$key] + $val ); } return $sums; } $array = ['KEY' => 5, 'TEST' => 3, 'Test' => 10, 'Key'=> 2]; $sums = add_array_vals($array); var_dump($sums); //Outputs // KEY => int(7) // TEST => int(13)
代码核心逻辑概述
这段代码的核心是把原数组的所有键统一转为大写,这样不管原键是大写、小写还是混合大小写,都会被归为同一个分组键,之后对同一个分组键对应的值进行累加求和。
针对你疑问的两处逻辑详解
第一处:初始化分组键的默认值
if ( !isset($sums[$key]) ) { $sums[$key] = 0; }
这行代码的作用是避免首次累加时出现未定义变量错误:
- 当遍历到原数组的某个键(已转大写)时,如果这个键还没在
sums数组里出现过,就先给它赋值为0。 - 比如第一次遍历到
KEY时,$sums['KEY']不存在,直接执行加法会抛出“未定义索引”的错误,先初始化0就能正常执行后续操作。
第二处:累加对应分组的值
$sums[$key] = ( $sums[$key] + $val );
这是实现求和的核心步骤:
- 如果是第一次处理这个分组键(已初始化为0),就是
0 + 当前值$val,相当于把第一个值存入sums数组。 - 如果不是第一次处理(比如原数组里的
Key转大写后也是KEY),就会把当前的$val加到sums数组中该键已有的总和上,实现累加。
动态识别相同键的原理
代码通过strtoupper($key)将所有原数组的键统一转为大写,直接解决了大小写差异的问题:
- 原数组中的
KEY、Key会被转为同一个大写键KEY;TEST、Test会被转为TEST。 - 遍历过程中,只要遇到相同的大写键,就会复用
sums数组中已有的索引,把对应的值累加进去,从而实现不区分大小写的分组求和。
内容的提问来源于stack exchange,提问作者Chunk
相关产品推荐
相关产品推荐

