<?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;
}
}
group by分组
最新推荐文章于 2021-03-17 02:12:14 发布