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

如何按匹配键合并数组并累加数值?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
        }
    }
}

解决方案

原代码问题分析

  1. 先将新条目加入数组再遍历累加,导致每次循环都会把刚加入的条目再累加一次,出现重复计算的问题。
  2. 使用&$value引用后未及时解除,可能导致后续变量类型异常,触发Cannot access offset of type string on string错误。
  3. 没有正确去重,最终数组里仍会保留所有原始条目,只是部分条目的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:23:21