micheledurante/array-aggregate

一个类似 SQL 的流聚合函数,用于按任意数量的列对一组行进行分组。您还可以定义如何计算组。预期行已经按用于聚合结果的列排序。

v1.1.0 2021-05-19 13:05 UTC

This package is auto-updated.

Last update: 2024-09-05 11:16:00 UTC


README

Build Status Latest Stable Version Latest Stable Version

一个类似 SQL 的流聚合函数,用于按任意数量的列对一组行进行分组。您还可以定义如何计算组。预期行已经按用于聚合结果的列排序。

function array_aggregate(array $columns, array $rows, callable $compute_func = null): array

向函数提供的列的顺序不会影响输出。列必须可以用 === 操作符进行比较。

灵感来源于 Craig Freedman 在 MS dev 博客上的 SQL 文章 https://blogs.msdn.microsoft.com/craigfr/2006/09/13/stream-aggregate

安装

作为一个 composer 包

composer require micheledurante/array-aggregate

或者要求在 src/array_aggregate.php 中使用源文件。

使用方法

$rows = [
    0 => [
        'store_id' => 1,
        'manager_id' => 2,
        'name' => 'Alice'
    ],
    1 => [
        'store_id' => 2,
        'manager_id' => 3,
        'name' => 'Bob'
    ],
    2 => [
        'store_id' => 2,
        'manager_id' => 3,
        'name' => 'Eve'
    ],
    3 => [
        'store_id' => 2,
        'manager_id' => 4,
        'name' => 'Foobar'
    ]
];

$groups = array_aggregate(array('store_id', 'manager_id'), $rows, function (array $group): array {
    return [
        'store_id' => $group[0]['store_id'],
        'manager_id' => $group[0]['manager_id'],
        'people' => implode(',', array_column($group, 'name'))
    ];
});

var_export($groups);

结果为

/*
array (
    0 => array (
        'store_id' => 1,
        'manager_id' => 2,
        'people' => 'Alice'
    ),
    1 => array (
        'store_id' => 2,
        'manager_id' => 3,
        'people' => 'Bob,Eve'
    ),
    2 => array (
        'store_id' => 2,
        'manager_id' => 4,
        'people' => 'Foobar'
    )
)
*/

类似的项目

array_group_by()

jakezatecky 提供。主要区别在于 array_aggregate() 不会通过创建新的键/嵌套组来更改数组的结构。它类似于 SQL 的 GROUP BY 子句,返回输入行的聚合。这两个函数都可以使用多个键。 array_aggregate() 不允许使用可调用匹配列。