php 模拟mysql group by分组

傷城~ 2023-10-16 22:41 96阅读 0赞

<?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://yuncode.net/code/c_549aeb315ad2219
``

发表评论

表情:
评论列表 (有 0 条评论,96人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MySQL GROUP BY分组查询

    在 MySQL SELECT 语句中,允许使用 GROUP BY 子句,将结果集中的数据行根据选择列的值进行逻辑分组,以便能汇总表内容的子集,实现对每个组而不是对整个结果集进行