PHP数组以某个字段分组求和

本文介绍了一种使用PHP实现的数组分组并按指定键进行数值相加的方法。通过对数组元素进行遍历和比较,实现了相同名称的数组项分数的累加,适用于如成绩统计等场景。
<?php 
	$list = array(
		0 => array('name' => 'aa', 'score' => 88),
		1 => array('name' => 'aa', 'score' => 99),
		2 => array('name' => 'bb', 'score' => 33),
		3 => array('name' => 'cc', 'score' => 99)
    );


	foreach ($list as $val) {
		$this->add_array($val, $new_arr, 'name');
	}
	//数组分组相加
 	public function add_array($arr, &$new_arr, $target_key) {
 		$num = count($new_arr); //计算新数组的大小,新数组也是二维的,这里计算的是第一维
 		$cmp_num = 0;
 		for ($i = 0; $i < $num; $i++) {
 			if ($arr[$target_key] != $new_arr[$i][$target_key]) {//判断新数组中的分组键名是否跟当前源数组中的分组键名相等
 				$cmp_num++; //如果不相等,比较次数自增1
 			} else {//如果相等,说明当前分组键名已经存在
 				$tar_exist = true; //设置存在标识为true
 				$tar_key = $i; //返回当前分组键名在新数组中的数字索引
 				break; //跳出循环
 			}
 		}
 		//如果比较次数跟新数组大小一样,说明当前分组键名不在新数组中,设置存在标识为false
 		if ($cmp_num == $num)
 			$tar_exist = false;
 		if ($tar_exist) {//如果分组键名已经存在,对该分组的数组元素进行相加
 			foreach ($arr as $key => $value) {
 				if ($key != $target_key) {//分组键名对应的元素值不相加
 					$new_arr[$tar_key][$key] += $value; //其余的元素值进行相加
 				}
 			}
 		} else {
 			$new_arr[$num][$target_key] = $arr[$target_key];
 			foreach ($arr as $key => $value) {
 				if ($key != $target_key) {//分组键名对应的元素值不相加
 					if(isset($new_arr[$num][$key])) {
 						$new_arr[$num][$key] += $value; //其余的元素值进行相加
 					}else {
 						$new_arr[$num][$key] = $value; //其余的元素值进行相加
 					}
 				}
 			}
 		}
 	}


?>

 

### 对象数组按 `id` 字段分组并对 `num` 字段求和的方法 在 JavaScript 或 PHP 中处理对象数组时,通常需要按照某个字段(如 `id`)对数组进行分组,并计算另一个字段(如 `num`)的总和。以下是具体实现方式: --- #### 使用 JavaScript 实现 JavaScript 可以借助 `reduce` 方法来完成此任务。以下是一个示例代码: ```javascript const data = [ { id: 1, num: 10 }, { id: 2, num: 20 }, { id: 1, num: 30 }, { id: 2, num: 40 }, { id: 3, num: 50 } ]; // 使用 reduce 方法进行分组求和 const result = Object.values(data.reduce((acc, curr) => { if (!acc[curr.id]) { acc[curr.id] = { id: curr.id, totalNum: 0 }; // 初始化新组 } acc[curr.id].totalNum += curr.num; // 累加 num 值 return acc; }, {})); console.log(result); // 输出结果: // [ // { id: 1, totalNum: 40 }, // { id: 2, totalNum: 60 }, // { id: 3, totalNum: 50 } // ] ``` 在这个例子中,`reduce` 函数用于遍历数组并累积结果到一个对象中,其中键为 `id`,值为对应的累加结果。最后通过 `Object.values` 获取所有的分组结果[^1]。 --- #### 使用 PHP 实现 PHP 中可以使用循环配合关联数组来实现相同的功能。以下是一个示例代码: ```php $data = [ ['id' => 1, 'num' => 10], ['id' => 2, 'num' => 20], ['id' => 1, 'num' => 30], ['id' => 2, 'num' => 40], ['id' => 3, 'num' => 50] ]; $result = []; foreach ($data as $item) { if (!isset($result[$item['id']])) { $result[$item['id']] = ['id' => $item['id'], 'totalNum' => 0]; // 初始化新组 } $result[$item['id']]['totalNum'] += $item['num']; // 累加 num 值 } // 将结果转换为数值索引数组 $result = array_values($result); print_r($result); /* 输出结果: Array ( [0] => Array ( [id] => 1 [totalNum] => 40 ) [1] => Array ( [id] => 2 [totalNum] => 60 ) [2] => Array ( [id] => 3 [totalNum] => 50 ) ) */ ``` 这段代码的核心思想是利用 `$result` 数组作为中间容器,将具有相同 `id` 的项聚合在一起,并逐步累加 `num` 值[^2]。 --- #### MongoDB 查询实现 如果数据存储在 MongoDB 中,则可以通过聚合管道 (`$group`) 来实现这一需求。假设集合名称为 `collection`,文档结构如下: ```json { "_id": ObjectId(...), "id": 1, "num": 10 } { "_id": ObjectId(...), "id": 2, "num": 20 } { "_id": ObjectId(...), "id": 1, "num": 30 } { "_id": ObjectId(...), "id": 2, "num": 40 } { "_id": ObjectId(...), "id": 3, "num": 50 } ``` 查询语句如下: ```javascript db.collection.aggregate([ { $group: { _id: "$id", // 按照 id 分组 totalNum: { $sum: "$num" } // 对 num 字段求和 } }, { $project: { _id: 0, // 隐藏自动生成的 _id id: "$_id", totalNum: 1 } } ]); ``` 执行后返回的结果类似于: ```json [ { "id": 1, "totalNum": 40 }, { "id": 2, "totalNum": 60 }, { "id": 3, "totalNum": 50 } ] ``` 这种方法适合大规模数据场景下的高效统计操作[^3]。 --- ### 总结 无论是前端 (JavaScript)、后端 (PHP),还是数据库层 (MongoDB),都可以灵活地实现基于 `id` 字段的对象数组分组以及 `num` 字段求和功能。每种方法都有其适用场景:对于小型数据集,推荐使用客户端脚本;而对于大型分布式数据集,则更适合采用数据库内置的聚合工具。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值