micheledurante / array-aggregate
一个类似 SQL 的流聚合函数,用于按任意数量的列对一组行进行分组。您还可以定义如何计算组。预期行已经按用于聚合结果的列排序。
v1.1.0
2021-05-19 13:05 UTC
Requires
- php: >=7.2
Requires (Dev)
- phing/phing: ^2.16
- phpunit/phpunit: ^8.1
README
一个类似 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()
不允许使用可调用匹配列。