PHP foreach因关联数组键大小写差异出现额外迭代 需合并不同大小写的同键值
PHP 关联数组键大小写合并实现方案
PHP 关联数组的键本身大小写敏感,拼写完全一致但仅大小写不同的键会被判定为独立条目,直接遍历自然会产生多余的迭代。针对你的场景可以按以下逻辑实现合并:
核心处理逻辑
- 以「统一转小写的键名」作为匹配的唯一判定标准,只要两个键转小写后字符串完全一致,就判定为需要合并的条目
- 合并时直接对同标识下的数值做累加,既可以保留原有键名格式,也可以按需统一为指定的命名规则
- 合并完成后再执行foreach遍历,就不会出现重复统计的问题
可直接套用的代码实现
如果希望合并后保留原有驼峰格式的键(匹配你示例里SourceTwo/SourceThree的命名风格),可以使用以下高效逻辑(通过映射表匹配大小写,数据量大时也不会有性能问题):
// 初始化合并后的结果容器、键映射表 $merged_conversion = []; $key_mapping = []; // 取待处理的原始数据 $raw_source_data = $this->daily_conversion_data['cnb_utm_totals']; foreach ($raw_source_data as $origin_key => $value) { // 把当前键转小写作为匹配标识 $lower_key = strtolower($origin_key); // 查映射表判断是否已经存在对应条目 if (isset($key_mapping[$lower_key])) { $actual_stored_key = $key_mapping[$lower_key]; // 匹配到已有条目,直接累加数值 $merged_conversion[$actual_stored_key] += $value; } else { // 无匹配则记录映射关系,新增条目保留原始键名 $key_mapping[$lower_key] = $origin_key; $merged_conversion[$origin_key] = $value; } }
结果适配说明
针对你给出的示例数组,上述逻辑跑通后的初始合并结果为:
[ "sourceone" => 62, // 原sourceone的56 + SourceOne的6 累加结果 "SourceTwo" => 76, "SourceThree" => 55 ]
如果需要把首项的键名替换为你要求的SourceOne格式,只需要在合并完成后做一次键名替换即可:
// 调整键名为指定格式 unset($merged_conversion['sourceone']); $merged_conversion['SourceOne'] = 62;
如果不想手动调整键名,可以在遍历原始数组前先对数组按键名做驼峰格式的排序,让
SourceOne这类标准格式的键排在同标识条目的最前面,合并时自然会优先保留这个格式的键名,不需要额外修改。也可以在新增条目时直接用字符串处理函数统一格式化键名,跳过对原始键名的依赖。
合并完成后,你原有的foreach循环只需要替换遍历源即可:
// 用合并后的数组作为遍历源 foreach($merged_conversion as $utm_source => $utm_data) { // 原有业务逻辑直接复用即可 }
内容的提问来源于stack exchange,提问作者SJW525
相关产品推荐
相关产品推荐

