- <?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;
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/0810201410565.html
来源: http://www.codesnippet.cn/detail/0810201410565.html