[php]代码库
<?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('year','month','day');
/*order by 后面的字段,可任意增加或减少*/
$orderBy = array('money'=>'asc','id'=>'desc');
/*操作 格式: mysql内置函数=>字段名|结果别名 */
$option = array('sum'=>'money|sum_money','average'=>'money|average_money,rebate','count'=>'id|total','group_concat'=>'distinct:name|concat_name,rebate');
//Func::p(Func::handdleData($arrs, $groupBy, $orderBy, $option));
Func::p(Func::resultOrderBy($arrs,$orderBy));
class Func{
static function p($data){
echo '<pre />';
print_r($data);
}
static function handdleData($arrs, $groupBy, $orderBy, $option){
$data = array();
foreach($arrs as $index=>$arr){
$groupKey = '';
foreach($groupBy as $v){
$groupKey .= $arr[$v].'-';
}
$groupKey = trim($groupKey,'-');
if(isset($data[$groupKey]))
array_push($data[$groupKey],$index);
else
$data[$groupKey][]=$index;
}
$data = Func::resultGroupBy($arrs,$data,$groupBy,$option);
$data = Func::resultOrderBy($data,$orderBy);
return $data;
}
static function resultGroupBy($arrs,$temp,$groupBy,$option){
$result = array();
foreach($temp as $key=>$value){
foreach($option as $k=>$f){
$parts = explode(',',$f);
$distinct = array();
foreach($parts as $part){
$exarr = explode('|',$part);
$filed = $exarr[0];
$aliasKey = isset($exarr[1]) ? $exarr[1] : '';
$aliasKey = !empty($aliasKey)?$aliasKey:$k.'_'.$filed;
if($k=='sum'){
$aliasValue = 0;
foreach($value as $v){
$aliasValue += $arrs[$v][$filed];
}
}elseif($k=='average'){
$aliasValue = 0;
foreach($value as $v){
$aliasValue += $arrs[$v][$filed];
}
$aliasValue = (float)$aliasValue/count($temp[$key]);
}elseif($k=='count'){
$aliasValue = count($value);
}elseif($k=='group_concat'){
if(strpos($filed,':')){
$distinct = explode(':', $filed);
$filed = $distinct[1];
}
$aliasValue = array();
foreach($value as $v){
$aliasValue[] = $arrs[$v][$filed];
}
$aliasValue = !empty($distinct) ? implode(',',array_unique($aliasValue)) : implode(',',$aliasValue);
}
$result[$key][$aliasKey] = $aliasValue;
}
}
}
foreach ($result as $key => &$value) {
$key = explode('-', $key);
for ($i = 0; $i < count($groupBy); $i++) {
$value[$groupBy[$i]] = $key[$i];
}
}
return array_values($result);
}
static function resultOrderBy($arrs,$orderBy){
$orderArr = array();
$orderType = array();
$sortRule = '';
foreach ($orderBy as $key => $value) {
$temp = array();
for($i = 0; $i < count($arrs); $i++){
$temp[] = $arrs[$i][$key];
}
$orderArr[] = $temp;
$orderType[] = $value == 'asc' ? SORT_ASC : SORT_DESC;
}
for($i=0; $i<count($orderBy); $i++) {
$sortRule .= '$orderArr['.$i.'],' . $orderType[$i].',' ;
}
//echo 'array_multisort('.$sortRule.'$arrs);';
eval('array_multisort('.$sortRule.'$arrs);');
return $arrs;
}
}