group by分组

<?php
 $arrs = array(
    array('id'=>3,'year'=>2014,'month'=>6,'day'=>2,'name'=>'test1','money'=>10233,'rebate'=>111),
    array('id'=>7,'year'=>2017,'month'=>6,'day'=>2,'name'=>'test2','money'=>12.36,'rebate'=>100),
    array('id'=>5,'year'=>2014,'month'=>6,'day'=>2,'name'=>'test1','money'=>10233,'rebate'=>111),
    array('id'=>11,'year'=>2017,'month'=>6,'day'=>2,'name'=>'test2','money'=>12.36,'rebate'=>100),
   );
  
 
 /*group by 后面的字段 可任意增加和减少*/
 $groupBy= array('id');
 
 /*操作  格式: mysql内置函数=>字段名|结果别名 */
 $option = array('sum'=>'money|sum_money','average'=>'money|average_money,rebate','count'=>'id|total','group_concat'=>'name|concat_name,rebate');
 //$option = array('sum'=>'money,rebate','average'=>'money,rebate');
 
 
 print_r(Func::resultGroupBy($arrs,$groupBy,$option));
 
class Func{
        static function resultGroupBy($arrs,$groupBy,$option){
            $temp = array();
            foreach($arrs as $index=>$arr){
                $groupKey = '';
                foreach($groupBy as $v){
                    $groupKey .= $arr[$v].'-';
                }
                $groupKey = trim($groupKey,'-');
                if(isset($temp[$groupKey]))
                    array_push($temp[$groupKey],$index);
                else
                    $temp[$groupKey][]=$index;
            }
            $result = array();
            foreach($temp as $key=>$value){
                foreach($option as $k=>$f){
                    $parts = explode(',',$f);
                    if($k=='sum'){
                        foreach($parts as $part){
                            $exarr = explode('|',$part);
                            $filed = $exarr[0];
                            $alias = isset($exarr[1]) ? $exarr[1] : '';
                            $alias = !empty($alias)?$alias:$k.'_'.$filed;
                            $sum = 0;
                            foreach($value as $v){
                                $sum +=$arrs[$v][$filed];
                            }
                            $result[$key][$alias] = $sum;
                        }
                    }elseif($k=='average'){
                         foreach($parts as $part){
                            $exarr = explode('|',$part);
                            $filed = $exarr[0];
                            $alias = isset($exarr[1]) ? $exarr[1] : '';
                            $alias = !empty($alias)?$alias:$k.'_'.$filed;
                            $sum = 0;
                            foreach($value as $v){
                                $sum +=$arrs[$v][$filed];
                            }
                            $result[$key][$alias] = (float)$sum/count($temp[$key]);
                        }
                    }elseif($k=='count'){
                        foreach($parts as $part){
                            $exarr = explode('|',$part);
                            $filed = $exarr[0];
                            $alias = isset($exarr[1]) ? $exarr[1] : '';
                            $alias = !empty($alias)?$alias:$k.'_'.$filed;
                            $result[$key][$alias] = count($value);
                        }
                    }elseif($k=='group_concat'){
                         foreach($parts as $part){
                            $exarr = explode('|',$part);
                            $filed = $exarr[0];
                            $alias = isset($exarr[1]) ? $exarr[1] : '';
                            $alias = !empty($alias)?$alias:$k.'_'.$filed;
                            $concatstr='';
                            foreach($value as $v){
                                $concatstr .=$arrs[$v][$filed].',';
                            }
                            $concatstr = trim($concatstr,',');
                            $result[$key][$alias] = $concatstr;
                        }
                    }
                }
            }
            $r = array();
            foreach($temp as $key=>$arr){
                foreach($arr as $index){
                    foreach(array_keys($arrs[$index]) as $v1){
                        if(!in_array($v1,$groupBy))
                            unset($arrs[$index][$v1]);
                    }
                    foreach($option as $k=>$v){
                        foreach(explode(',',$v) as $part){
                            $exarr = explode('|',$part);
                            $filed = $exarr[0];
                            $alias = isset($exarr[1]) ? $exarr[1] : '';
                            $alias = !empty($alias)?$alias:$k.'_'.$filed;
                            $arrs[$index][$alias] = $result[$key][$alias];
                        }
                    }
                    $r[]=$arrs[$index];
                    break;
                }
            }
            return $r;
        }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值