如何聚合PHP数组里的数据库查询结果重复项

来源:AI大模型作者:半糖头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何聚合PHP数组里的数据库查询结果重复项》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何聚合PHP数组里的数据库查询结果重复项》有用,将其分享出去将是对创作者最好的鼓励。

当从数据库查询出包含重复标识的数据后,我们可以通过PHP的数组操作技巧,将重复项的数据聚合到同一个数组元素中,让数据结构更符合业务需求。

如何聚合PHP数组里的数据库查询结果重复项

场景示例

假设我们从数据库查询出了用户的订单列表,原始查询结果如下,同一个用户可能有多个订单,用户ID是重复的:

$origin_data = [
    ['user_id' => 1, 'order_id' => 101, 'amount' => 99.9],
    ['user_id' => 1, 'order_id' => 102, 'amount' => 199.9],
    ['user_id' => 2, 'order_id' => 103, 'amount' => 299.9],
    ['user_id' => 2, 'order_id' => 104, 'amount' => 399.9],
    ['user_id' => 3, 'order_id' => 105, 'amount' => 499.9],
];

方法一:使用循环手动聚合

通过遍历原始数组,以重复的标识字段作为新数组的键,将重复项的数据合并到对应键的数组中,是最基础也最容易理解的方法。

$result = [];
foreach ($origin_data as $item) {
    $user_id = $item['user_id'];
    // 如果当前用户ID对应的键不存在,先初始化数组
    if (!isset($result[$user_id])) {
        $result[$user_id] = [
            'user_id' => $user_id,
            'order_list' => [],
            'total_amount' => 0
        ];
    }
    // 将订单信息加入订单列表
    $result[$user_id]['order_list'][] = [
        'order_id' => $item['order_id'],
        'amount' => $item['amount']
    ];
    // 累加总金额
    $result[$user_id]['total_amount'] += $item['amount'];
}
// 如果需要重置索引,可以使用array_values函数
$final_result = array_values($result);
print_r($final_result);

方法二:使用array_reduce函数聚合

array_reduce函数可以对数组中的元素依次回调处理,适合用来做数组的重构和聚合操作,代码会更简洁。

$result = array_reduce($origin_data, function ($carry, $item) {
    $user_id = $item['user_id'];
    if (!isset($carry[$user_id])) {
        $carry[$user_id] = [
            'user_id' => $user_id,
            'order_list' => [],
            'total_amount' => 0
        ];
    }
    $carry[$user_id]['order_list'][] = [
        'order_id' => $item['order_id'],
        'amount' => $item['amount']
    ];
    $carry[$user_id]['total_amount'] += $item['amount'];
    return $carry;
}, []);
$final_result = array_values($result);
print_r($final_result);

聚合后的数据结构

以上两种方法最终得到的$final_result结构如下,同一个用户的订单都被聚合到了同一个元素中:

Array
(
    [0] => Array
        (
            [user_id] => 1
            [order_list] => Array
                (
                    [0] => Array
                        (
                            [order_id] => 101
                            [amount] => 99.9
                        )
                    [1] => Array
                        (
                            [order_id] => 102
                            [amount] => 199.9
                        )
                )
            [total_amount] => 299.8
        )
    [1] => Array
        (
            [user_id] => 2
            [order_list] => Array
                (
                    [0] => Array
                        (
                            [order_id] => 103
                            [amount] => 299.9
                        )
                    [1] => Array
                        (
                            [order_id] => 104
                            [amount] => 399.9
                        )
                )
            [total_amount] => 699.8
        )
    [2] => Array
        (
            [user_id] => 3
            [order_list] => Array
                (
                    [0] => Array
                        (
                            [order_id] => 105
                            [amount] => 499.9
                        )
                )
            [total_amount] => 499.9
        )
)

注意事项

  • 聚合时作为键的字段要确保唯一性,避免出现意外的键覆盖问题。
  • 如果原始数据量较大,循环方法的性能会更稳定,复杂函数调用可能会带来额外的性能开销。
  • 聚合后的数组如果需要保持原有顺序,可以在初始化键的时候记录顺序,最后再按顺序排列。

PHP数组数据库查询数组重构重复项聚合修改时间:2026-06-05 08:09:00

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。