Zebra-PHP-ArrayGroupBy

Apache
PHP
跨平台
2015-01-29
呼延平

为什么使用Zebra-PHP-ArrayGroupBy

在如下场景中,我们总是希望能够在php中使用类似mysql的groupby操作:

  • SQL过于复杂,造成数据库运算效率低下

  • 从数据库中读取出原始数据,在php中进行运算,增强代码重用率

  • 其他非数据库场景的数组归并场景

Zebar-PHP-ArrayGroupBy能够做什么

  • 对二维数组进行归并

  • 归并的同时,支持对字段进行自定义处理

  • 比SQL更灵活的自定义函数,你可以随意编写归并和字段合并函数

示例:

$records = [
    ['order_date' => '2014-01-01', 'price' => 5],
    ['order_date' => '2014-01-02', 'price' => 10],
    ['order_date' => '2014-01-03', 'price' => 20],
    ['order_date' => '2015-01-04', 'price' => 25],
];
$group_by_fields = [
    'order_date' => function($value){
            return date('Y', strtotime($value));
        }
];
$group_by_value = [
    'order_date' => [
        'callback' => function($value_array){
                return substr($value_array[0], 0, 4);
            },
        'as' => 'year'
    ],
    'price' => function($data){
            return array_sum(array_column($data, 'price'));
        },
];
$grouped = \Jenner\Zebra\ArrayGroupBy::groupBy($records, $group_by_fields, $group_by_value);
print_r($grouped);

结果:

Array
(
    [0] => Array
        (
            [year] => 2014
            [price] => 35
        )
    [1] => Array
        (
            [year] => 2015
            [price] => 25
        )
)

举例

  • 归并过程中,实现对结果的中值计算

  • 归并过程中,对时间字段进行自定义处理,例如归并每5分钟的数据

  • 等等

链式调用

$records = [
    ['bill_time'=>'2014-01-01 00:00:00', 'price'=>1, 'cnt'=>3,],
    ['bill_time'=>'2014-01-01 00:00:00', 'price'=>1, 'cnt'=>3,],
    ['bill_time'=>'2014-01-01 00:00:00', 'price'=>1, 'cnt'=>3,],
    ['bill_time'=>'2014-01-02 00:00:00', 'price'=>1, 'cnt'=>3,],
    ['bill_time'=>'2014-01-02 00:00:00', 'price'=>1, 'cnt'=>3,],
    ['bill_time'=>'2014-01-03 00:00:00', 'price'=>1, 'cnt'=>3,],
    ['bill_time'=>'2014-01-03 00:00:00', 'price'=>1, 'cnt'=>3,],
    ['bill_time'=>'2014-01-03 00:00:00', 'price'=>1, 'cnt'=>3,],
    ['bill_time'=>'2014-01-04 00:00:00', 'price'=>1, 'cnt'=>3,],
    ['bill_time'=>'2014-01-04 00:00:00', 'price'=>1, 'cnt'=>3,],
    ['bill_time'=>'2014-01-04 00:00:00', 'price'=>1, 'cnt'=>3,],
    ['bill_time'=>'2014-01-04 00:00:00', 'price'=>1, 'cnt'=>3,],
];
$group_by_fields = [
    'bill_time' => function($field){
            return substr($field, 0, 10);
        }
];
$group_by_values = [
    'bill_time' => function($field_values){
            return substr($field_values[0], 0, 10);
        },
    'price' => function($field_values){
            return array_sum($field_values);
        },
    'cnt' => function($field_values){
            return array_sum($field_values);
        }
];
$week_fields = [
    'bill_time' => function($field){
            return date('w', strtotime($field));
        }
];
$week_values = [
    'bill_time' => function($data){
            return date('w', strtotime($data[0]['bill_time']));
        },
    'price' => function($data){
            return array_sum(array_column($data, 'price'));
        },
    'cnt' => function($data){
            return array_sum(array_column($data, 'cnt'));
        }
];
$grouped = (new \Jenner\Zebra\ArrayGroupBy($records))->groupByField($group_by_fields)->groupByValue($group_by_values)->groupByField($week_fields)->groupByValue($week_values)->get();
print_r($grouped);
加载中

评论(0)

暂无评论

暂无资讯

暂无问答

Zebra_Image,PHP的图形处理轻量工具

Zebra_Image,PHP的图形处理轻量工具,分享使用Zebra_Image的常用方法,有些不懂或写的不好的望指教_(:з」∠)_

2016/07/13 20:26
77
0
专用Cisco路由器的替代品 Zebra

动态、健壮的路由对于 Internet 网络来说极其重要,因此任何一个初涉此领域的网络工程师不仅需要理解路由的概念,而且要有能力在真正的环境下驾驭它。但是,路由领域由高端网络设备供应商(比...

2009/09/30 16:58
382
0
Linux中增加软路由的三种方法

Linux中增加软路由的三种方法   第一种:route add -net 172.16.6.0 netmask 255.255.255.0 gw 172.16.2.254 dev eth0/* 增加一条网络172.16.6.0/24 经过172.16.2.254 eth0 *//* -net增加网...

2012/11/22 13:29
1K
0
常用工具

用客观理性的态度看待问题,而不是抱怨、挑剔的眼光。

2013/11/15 18:00
193
0
Ubuntu10.04 下 quagga(zebra)环境搭建

Quagga是一款功能比较强大的开源路由软件,支持rip,ripng,ospfv2,ospfv3,bgp等协议。目前最新版本为Quagga 0.99.23。安装Quagga的目的是使装有linux(我采用的是Ubuntu10.04LTS)系统的电脑变...

2014/10/24 17:53
191
0
quagga 软路由

安装 quagga yum install quagga 基本配置 vim /etc/quagga/zebra.conf hostname router password router 保存退出,执行 service zebra start 接着进行 telnet 操作 telnet 127.0.0.1 2601 ...

2012/06/24 21:29
339
0
Apache 2.4.x 对比 2.2.x虚拟主机配置不同

Apache 2.4.x 对比 2.2.x 很多配置都不一样。 虚拟主机配置访问权限配置不同: 按照2.2.x的配置方法,会报下面的错误: AH01630: client denied by server configuration: /var/www/html/login...

2018/04/02 12:02
28
0
利用Quagga搭建OSPF动态路由

过程: 安装Centos-7-Minimal 更换阿里云源 wget http://mirrors.aliyun.com/repo/Centos-7.repo #下载阿里云repo文件 cp ./Centos-7.repo /etc/yum.repo.d/Centos-Base.repo #复制阿里云rep...

04/08 22:13
20
0
net-snmp和zebra软件的融合时怎么不需要snmpd.conf配置文件

问题来源:三层交换机开发 需求:在zebra中支持snmp功能时不需要snmpd.conf配置文件 问题解决: 在net-snmp中将解析配置文件的函数找到。 如解析trap的函数: snmpd_parse_config_trapsink(...

2013/04/12 00:00
204
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部