<?php
/**
  * 根据子字段分组
  * @param $data  原始数据
  * @param $keys  需要分组的字段
  * @return mixed
*/
public function groupBy($array, $keys)
{
    $i = 0;
    while ($i < count($array)) {
        $x = count($array) - 1;
        while ($x > $i) {
            //取数组交集并返回交集,保留键名
            $temp = array_intersect_assoc($array[$i], $array[$x]);
            if (!empty($temp)) {
                // 取键名交集,并做比较,如果相交等于分组依据的键名,则说明两个子数组可以合并
                if (array_intersect_assoc($keys, array_keys($temp)) == $keys) {
                    foreach ($array[$i] as $k => $v) {
                        if (!in_array($k, $keys)) {
                            $array[$i][$k] += $array[$x][$k];
                        }
                    }

                    //将合并部分移出数组
                    array_splice($array, $x, 1);
                }
            }
            $x--;
        }
        $i++;
    }
    return $array;
}

?>