PHP如何按键合并子数组并对值求和?
解决PHP单元素数组合并:重复键值求和问题
嘿,别慌!我来帮你搞定这个PHP数组合并求和的问题~ 你的需求很明确:把多个单元素的关联数组合并,保留用户ID作为键,重复ID的分数累加。
核心思路
我们需要初始化一个空数组来存放最终结果,然后遍历每一个单元素数组:
- 取出每个数组里的用户ID(键)和对应的分数(值)
- 如果结果数组里已经有这个用户ID,就把分数累加进去
- 如果没有,就直接把这个ID和分数添加到结果数组里
具体实现代码
假设你的所有单元素数组都存放在一个大数组$singleArrays里,代码可以这样写:
// 示例:你的所有单元素数组集合 $singleArrays = [ [36868 => 3], [2112 => 3], [35901 => 3], [6496 => 3], [87 => 3], [36868 => 3], [68 => 3], [9068 => 3], [47 => 3], ]; // 初始化结果数组 $result = []; foreach ($singleArrays as $arr) { // 取出当前单元素数组的键(用户ID)和值(分数) $userId = key($arr); $score = current($arr); // 判断是否已存在该用户ID,存在则累加,不存在则赋值 if (isset($result[$userId])) { $result[$userId] += $score; } else { $result[$userId] = $score; } } // 输出最终结果 print_r($result);
运行这段代码后,你会得到期望的结果:
Array ( [36868] => 6 [2112] => 3 [35901] => 3 [6496] => 3 [87] => 3 [68] => 3 [9068] => 3 [47] => 3 )
更简洁的写法(用array_reduce)
如果你喜欢更简洁的代码,可以用array_reduce函数来实现:
$result = array_reduce($singleArrays, function($carry, $item) { $userId = key($item); $score = current($item); // 用null合并运算符简化判断:不存在则默认0,再加当前分数 $carry[$userId] = ($carry[$userId] ?? 0) + $score; return $carry; }, []); print_r($result);
为什么你的之前的代码没生效?
你之前写的这段代码逻辑有问题:
foreach ($array as $key => &$value) { if ($value[0] == $value[1]) { $value[1] += $value[1]; } }
因为你的数组是关联数组(键是用户ID,不是0、1这种索引),所以$value[0]和$value[1]根本不存在,判断条件永远不成立,自然不会有任何累加效果。
另外,即使改成[userid => xxx, score => xxx]的结构,也需要针对userid字段去判断累加,而不是比较数组里的元素哦~
如果是这种结构的数组,处理代码可以这样写:
$userScoreArrays = [ ['userid' => 36868, 'score' => 3], ['userid' => 2112, 'score' => 3], // ... 其他元素 ]; $result = []; foreach ($userScoreArrays as $item) { $userId = $item['userid']; $score = $item['score']; $result[$userId] = ($result[$userId] ?? 0) + $score; }
这样也能得到正确的合并结果~
内容的提问来源于stack exchange,提问作者MarkyMark
相关产品推荐
相关产品推荐

