
本文将详细介绍如何利用PHP的`array_reduce`函数,高效地处理包含重复项的数组数据。当数组元素需要根据两个或多个键(如`user_id`和`item_id`)进行分组,并对某个数值字段(如`quantity`)进行求和时,本教程提供了一种保持原始数据结构并生成聚合结果的专业方法。
在日常的PHP开发中,我们经常会遇到需要对复杂数组进行数据聚合的场景。例如,一个订单列表可能包含多个相同用户购买相同商品的记录,而我们希望将这些记录合并,并汇总其购买数量。本教程将深入探讨如何使用PHP内置的array_reduce函数,优雅且高效地实现这一目标,同时保持最终数组的结构清晰。
假设我们有一个源数组,其中每个元素都是一个关联数组,包含user_id、item_id和quantity等字段。我们发现某些user_id和item_id的组合在数组中出现了多次,而我们希望将这些重复的组合合并成一个单一的记录,并将其对应的quantity值进行累加。
源数据示例:
立即学习“PHP免费学习笔记(深入)”;
$source = [
["user_id" => 1, "item_id" => 991, "quantity" => 100],
["user_id" => 1, "item_id" => 992, "quantity" => 50],
["user_id" => 1, "item_id" => 993, "quantity" => 300],
["user_id" => 1, "item_id" => 992, "quantity" => 150], // user_id 1, item_id 992 重复
["user_id" => 2, "item_id" => 991, "quantity" => 75],
["user_id" => 2, "item_id" => 992, "quantity" => 20],
["user_id" => 3, "item_id" => 991, "quantity" => 200],
["user_id" => 3, "item_id" => 992, "quantity" => 425],
["user_id" => 3, "item_id" => 991, "quantity" => 100], // user_id 3, item_id 991 重复
["user_id" => 3, "item_id" => 992, "quantity" => 75] // user_id 3, item_id 992 重复
];目标结果示例:
$result = [
["user_id" => 1, "item_id" => 991, "quantity" => 100],
["user_id" => 1, "item_id" => 992, "quantity" => 200], // 50 + 150
["user_id" => 1, "item_id" => 993, "quantity" => 300],
["user_id" => 2, "item_id" => 991, "quantity" => 75],
["user_id" => 2, "item_id" => 992, "quantity" => 20],
["user_id" => 3, "item_id" => 991, "quantity" => 300], // 200 + 100
["user_id" => 3, "item_id" => 992, "quantity" => 500] // 425 + 75
];array_reduce函数是一个强大的工具,用于将数组迭代地缩减为单个值。在本例中,我们将利用它将源数组缩减为一个聚合后的新数组。其基本语法为:array_reduce(array $array, callable $callback, mixed $initial)。
核心思路:
实现代码:
<?php
$source = [
["user_id" => 1, "item_id" => 991, "quantity" => 100],
["user_id" => 1, "item_id" => 992, "quantity" => 50],
["user_id" => 1, "item_id" => 993, "quantity" => 300],
["user_id" => 1, "item_id" => 992, "quantity" => 150],
["user_id" => 2, "item_id" => 991, "quantity" => 75],
["user_id" => 2, "item_id" => 992, "quantity" => 20],
["user_id" => 3, "item_id" => 991, "quantity" => 200],
["user_id" => 3, "item_id" => 992, "quantity" => 425],
["user_id" => 3, "item_id" => 991, "quantity" => 100],
["user_id" => 3, "item_id" => 992, "quantity" => 75]
];
$aggregatedResult = array_reduce(
$source,
function($accumulator, $currentItem) {
// 构建一个唯一的组合键,使用下划线增加可读性,并避免潜在的数字拼接歧义
$uniqueKey = $currentItem['user_id'] . '_' . $currentItem['item_id'];
if (isset($accumulator[$uniqueKey])) {
// 如果该组合键已存在,则累加quantity
$accumulator[$uniqueKey]['quantity'] += $currentItem['quantity'];
} else {
// 如果是新组合,则将其添加到累加器
$accumulator[$uniqueKey] = $currentItem;
}
return $accumulator;
},
[] // 初始累加器为空数组
);
// 移除临时字符串键,得到最终的数值索引数组
$finalResult = array_values($aggregatedResult);
print_r($finalResult);
?>代码解析:
以上就是PHP数组高级聚合:根据多键值合并并求和的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号