0

0

PHP中数组对象按指定属性合并与数值求和的实现指南

花韻仙語

花韻仙語

发布时间:2025-07-22 13:20:01

|

452人浏览过

|

来源于php中文网

原创

PHP中数组对象按指定属性合并与数值求和的实现指南

本文详细介绍了在PHP中如何处理包含重复对象的数组,并根据特定属性(如用户ID)进行合并,同时对另一个属性(如积分)进行累加求和。通过实例代码,展示了使用json_decode、array_reduce和array_sum等函数实现数据分组、聚合的步骤,旨在帮助开发者高效地整理和分析结构化数据。

在数据处理和分析中,我们经常会遇到需要对数组中的对象进行去重和聚合的场景。例如,一个用户交易记录列表中可能包含多条同一用户的交易,我们希望将这些记录合并,并计算该用户所有交易的总积分。本教程将详细讲解如何在php中实现这一功能。

问题描述

假设我们有一个包含用户积分数据的数组,其中每个元素都是一个包含user_id和point的对象。由于某些原因,同一个user_id可能会出现多次,我们希望将这些重复的user_id对应的记录合并为一条,并将其point值进行累加。

原始数据示例:

[
  {
    "user_id": 2,
    "point": 2
  },
  {
    "user_id": 16,
    "point": 3
  },
  {
    "user_id": 2,
    "point": 10
  },
  {
    "user_id": 2,
    "point": 10
  }
]

期望结果示例:

[
  {
    "user_id": 2,
    "point": 22
  },
  {
    "user_id": 16,
    "point": 3
  }
]

解决方案步骤

实现这一目标的核心思路是:首先将数据按照指定的合并属性(user_id)进行分组,然后对每个分组内的数值属性(point)进行求和,最后重构出新的结果数组。

立即学习PHP免费学习笔记(深入)”;

1. 数据准备与解析

如果你的数据是以JSON字符串形式存在,首先需要将其解析为PHP数组。json_decode函数可以将JSON字符串转换为PHP变量。第二个参数设为true时,会将JSON对象解析为关联数组。

<?php

$jsonData = '[
  {
    "user_id": 2,
    "point": 2
  },
  {
    "user_id": 16,
    "point": 3
  },
  {
    "user_id": 2,
    "point": 10
  },
  {
    "user_id": 2,
    "point": 10
  }
]';

$users = json_decode($jsonData, true);

// 此时 $users 的结构如下:
/*
[
    ['user_id' => 2, 'point' => 2],
    ['user_id' => 16, 'point' => 3],
    ['user_id' => 2, 'point' => 10],
    ['user_id' => 2, 'point' => 10]
]
*/
?>

2. 基于特定属性进行分组

接下来,我们需要将数据按照user_id进行分组。array_reduce函数非常适合这种累积操作,它可以遍历数组并根据回调函数的结果累积一个单一的值。在这里,我们将累积一个以user_id为键,以包含该user_id所有原始记录的数组为值的关联数组。

<?php
// 假设 $users 已从上一步获取

$groupedById = array_reduce($users, function ($accumulator, $user) {
    $accumulator[$user['user_id']][] = $user;
    return $accumulator;
}, []);

// 此时 $groupedById 的结构如下:
/*
[
    2 => [
        ['user_id' => 2, 'point' => 2],
        ['user_id' => 2, 'point' => 10],
        ['user_id' => 2, 'point' => 10]
    ],
    16 => [
        ['user_id' => 16, 'point' => 3]
    ]
]
*/
?>

在上述代码中:

知我AI
知我AI

一款多端AI知识助理,通过一键生成播客/视频/文档/网页文章摘要、思维导图,提高个人知识获取效率;自动存储知识,通过与知识库聊天,提高知识利用效率。

下载
  • $accumulator 是累加器,初始值为空数组 []。
  • 每次迭代,我们将当前 $user 数组添加到 $accumulator 中以 $user['user_id'] 为键的子数组中。如果该键不存在,PHP会自动创建。

3. 累加求和并重构结果

分组完成后,我们遍历每个分组,对其中的point值进行求和,并构建最终的结果数组。array_column函数可以方便地从多维数组中提取某一列的值,而array_sum则用于计算数组中所有值的和。

<?php
// 假设 $groupedById 已从上一步获取

$result = [];
foreach ($groupedById as $userId => $userRecords) {
    // 提取当前 user_id 对应的所有 point 值
    $points = array_column($userRecords, 'point');
    // 计算这些 point 值的总和
    $sumPoints = array_sum($points);

    // 构建新的结果元素并添加到 $result 数组中
    $result[] = ['user_id' => $userId, 'point' => $sumPoints];
}

// 此时 $result 的结构如下:
/*
[
    ['user_id' => 2, 'point' => 22],
    ['user_id' => 16, 'point' => 3]
]
*/
?>

4. 结果输出(可选)

如果需要将最终结果再次输出为JSON格式,可以使用json_encode函数。

<?php
// 假设 $result 已从上一步获取

echo json_encode($result);
?>

输出:

[{"user_id":2,"point":22},{"user_id":16,"point":3}]

完整代码示例

将上述步骤整合在一起,形成一个完整的解决方案:

<?php

$jsonData = '[
  {
    "user_id": 2,
    "point": 2
  },
  {
    "user_id": 16,
    "point": 3
  },
  {
    "user_id": 2,
    "point": 10
  },
  {
    "user_id": 2,
    "point": 10
  }
]';

// 1. 将JSON数据解析为PHP数组
$users = json_decode($jsonData, true);

// 2. 根据 user_id 进行分组
$groupedById = array_reduce($users, function ($accumulator, $user) {
    $accumulator[$user['user_id']][] = $user;
    return $accumulator;
}, []);

// 3. 遍历分组,累加 point 值并重构结果数组
$result = [];
foreach ($groupedById as $userId => $userRecords) {
    $sumPoints = array_sum(array_column($userRecords, 'point'));
    $result[] = ['user_id' => $userId, 'point' => $sumPoints];
}

// 4. 输出最终结果(可选,可根据需求选择输出格式)
header('Content-Type: application/json'); // 设置响应头为JSON
echo json_encode($result, JSON_PRETTY_PRINT); // 使用 JSON_PRETTY_PRINT 使输出更易读

?>

注意事项与总结

  • 数据类型一致性: 确保用于合并的键(如user_id)和用于求和的数值(如point)在原始数据中类型一致且符合预期。array_sum会自动尝试将非数值转换为数值,但最佳实践是确保数据源的清洁。
  • 性能考量: 对于非常大的数据集(例如数十万或数百万条记录),上述方法在内存使用和执行时间上可能需要优化。array_reduce和foreach循环在处理大量数据时效率较高,但如果内存成为瓶颈,可能需要考虑分块处理或使用数据库的聚合功能。
  • 灵活性: 这种模式非常灵活,不仅适用于user_id和point,还可以应用于任何需要根据一个或多个属性进行分组并对其他数值属性进行聚合的场景。只需修改array_reduce中的分组键和array_column中的求和属性即可。
  • 错误处理: 在实际应用中,应考虑json_decode可能返回null(解析失败)的情况,并加入相应的错误处理逻辑。
  • 替代方法: 虽然array_reduce和array_column是简洁高效的PHP内置函数,但也可以通过简单的foreach循环手动实现分组和求和,这在某些情况下可能更易于理解或调试。例如,分组步骤可以这样实现:
    $groupedByIdSimple = [];
    foreach ($users as $user) {
        if (!isset($groupedByIdSimple[$user['user_id']])) {
            $groupedByIdSimple[$user['user_id']] = 0; // 初始化总和
        }
        $groupedByIdSimple[$user['user_id']] += $user['point']; // 直接累加
    }
    // 然后将 $groupedByIdSimple 转换为期望的数组格式
    $resultSimple = [];
    foreach ($groupedByIdSimple as $userId => $sumPoints) {
        $resultSimple[] = ['user_id' => $userId, 'point' => $sumPoints];
    }

    这种替代方法在某些场景下可能更直观,并且避免了创建中间的嵌套数组结构,直接在分组的同时完成求和。

掌握这种数据聚合技术对于处理和分析结构化数据至关重要,它能帮助开发者高效地将原始、分散的数据转化为有意义的汇总信息。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

83

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

338

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

225

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

255

2023.09.22

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
誉天教育RHCE视频教程
誉天教育RHCE视频教程

共9课时 | 1.5万人学习

尚观Linux RHCE视频教程(二)
尚观Linux RHCE视频教程(二)

共34课时 | 6.1万人学习

尚观RHCE视频教程(一)
尚观RHCE视频教程(一)

共28课时 | 4.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号