如何按匹配键合并数组并累加数值?PHP数组问题求助
问题:合并数组并累加匹配
name字段的hours值 我长期在此学习知识,这是首次发帖。我需要合并数组,当name字段匹配时累加hours字段的数值,已给出示例数组与期望结果。现有代码会重复累加首个实例的数值,且无法移除重复数据,尝试添加array_pop($php_data_array)时出现错误:Fatal error: Uncaught TypeError: Cannot access offset of type string on string,恳请帮助。
示例数组
Array ( [0] => Array ( [name] => Hunter [hours] => 4.00 ) [1] => Array ( [name] => Hunter [hours] => 4.00 ) [2] => Array ( [name] => Leon [hours] => 8.00 ) [3] => Array ( [name] => Rowdy [hours] => 8.00 ) [4] => Array ( [name] => Hunter [hours] => 8.00 ) [5] => Array ( [name] => Lonnie [hours] => 8.00 ) [6] => Array ( [name] => Leon [hours] => 8.00 ) [7] => Array ( [name] => Gavin [hours] => 8.00 ) )
期望结果
Array ( [0] => Array ( [name] => Hunter [hours] => 16.00 ) [1] => Array ( [name] => Leon [hours] => 16.00 ) [2] => Array ( [name] => Rowdy [hours] => 8.00 ) [3] => Array ( [name] => Lonnie [hours] => 8.00 ) [4] => Array ( [name] => Gavin [hours] => 8.00 ) )
现有代码
while($entries=mysqli_fetch_assoc($get_time_sheets)) { $php_data_array[] = $entries; // Adding to array foreach($php_data_array as &$value){ if($value['name'] === $entries['name']){ $value['hours'] = $value['hours'] + $entries['hours']; break; // Stop the loop after we've found the item } } }
解决方案
原代码问题分析
- 先将新条目加入数组再遍历累加,导致每次循环都会把刚加入的条目再累加一次,出现重复计算的问题。
- 使用
&$value引用后未及时解除,可能导致后续变量类型异常,触发Cannot access offset of type string on string错误。 - 没有正确去重,最终数组里仍会保留所有原始条目,只是部分条目的hours被错误累加。
正确实现代码
推荐用name作为临时数组的键,直接累加对应hours,最后再转成索引数组,逻辑更清晰且避免重复计算:
$php_data_array = []; while ($entries = mysqli_fetch_assoc($get_time_sheets)) { $name = $entries['name']; // 如果该name已存在,累加hours;否则初始化 if (isset($php_data_array[$name])) { $php_data_array[$name]['hours'] += $entries['hours']; } else { $php_data_array[$name] = $entries; } } // 将关联数组转为索引数组,符合期望结果格式 $php_data_array = array_values($php_data_array);
代码说明
- 用
name作为临时数组的键,确保每个name只存在一个条目,天然去重。 - 每次读取数据库条目时,直接判断是否已有该
name,有则累加,无则新增,避免重复计算。 - 最后用
array_values()将关联数组转为索引数组,结构和期望结果一致。
关于原错误的解释
你尝试添加array_pop($php_data_array)时出现类型错误,大概率是因为原代码中foreach使用了引用&$value,循环结束后$value仍指向数组最后一个元素的引用,后续操作可能意外修改了变量类型,导致无法以数组方式访问。上述正确代码不需要使用引用,从根源避免了这类问题。
内容的提问来源于stack exchange,提问作者Nurples
相关产品推荐
相关产品推荐

