PHP根据多个键分组|多字段分组

这是一个PHP函数,用于根据指定的子字段对数组进行分组和合并。它通过遍历数组,找出子数组的交集,并判断是否符合分组条件。如果满足条件,则合并子数组并从原数组中移除合并后的元素。该函数对于处理和聚合数据非常有用。
<?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;
}

?>

在编程中,根据列表中的某个字段进行分组是一种常见的操作。不同的语言和数据结构提供了多种实现方式。以下是一些常见编程语言中实现分组的方法: ### JavaScript 中使用 `reduce` 进行分组 JavaScript 提供了一种非常灵活的方式来实现列表的分组操作,即使用 `Array.prototype.reduce` 方法。这种方法允许通过某个字段将数据分组,并且可以非常方便地进行扩展。 例如,假设有一个包含多个对象的数组,每个对象都有一个 `category` 字段,可以使用以下代码将数据按照 `category` 分组: ```javascript var categoryAndObjMapList = productDataList.reduce((result, currValue) => { let currCategory = currValue.category; result[currCategory] = (result[currCategory]) ?? []; result[currCategory].push(currValue); return result; }, {}); ``` ### Python 中使用 `itertools.groupby` 进行分组 在 Python 中,可以使用 `itertools.groupby` 函数来实现类似的功能。需要注意的是,`itertools.groupby` 要求数据是已经按照分组字段排序的,否则可能会导致分组不正确。 以下是一个使用 `itertools.groupby` 的示例: ```python from operator import itemgetter from itertools import groupby rows = [ {'address': '5412 N CLARK', 'date': '07/01/2012'}, {'address': '5148 N CLARK', 'date': '07/04/2012'}, {'address': '5800 E 58TH', 'date': '07/02/2012'}, {'address': '2122 N CLARK', 'date': '07/03/2012'}, {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'}, {'address': '1060 W ADDISON', 'date': '07/02/2012'}, {'address': '4801 N BROADWAY', 'date': '07/01/2012'}, {'address': '1039 W GRANVILLE', 'date': '07/04/2012'}, ] # 先按照日期排序 rows.sort(key=itemgetter('date')) # 按照日期进行分组 for date, items in groupby(rows, key=itemgetter('date')): print(date) for i in items: print(' ', i) ``` ### Java 中使用 `Map` 进行分组 在 Java 中,可以使用 `Map` 来实现分组操作。通过遍历列表中的每个元素,并根据某个字段作为存储到 `Map` 中,可以非常方便地实现分组。 例如,假设有一个包含多个对象的列表,每个对象都有一个 `excpbatch` 字段,可以使用以下代码将数据按照 `excpbatch` 分组: ```java private Map<String, List<TmExcpNewVo>> groupBillingDataByExcpBatchCode(List<TmExcpNewVo> billingList) throws Exception { Map<String, List<TmExcpNewVo>> resultMap = new HashMap<>(); try { for (TmExcpNewVo tmExcpNew : billingList) { if (resultMap.containsKey(tmExcpNew.getExcpbatch())) { resultMap.get(tmExcpNew.getExcpbatch()).add(tmExcpNew); } else { List<TmExcpNewVo> tmpList = new ArrayList<>(); tmpList.add(tmExcpNew); resultMap.put(tmExcpNew.getExcpbatch(), tmpList); } } } catch (Exception e) { throw new Exception("按照异常批次号对已开单数据进行分组时出现异常", e); } return resultMap; } ``` ### PHP 中使用 `array_filter` 和 `array_pluck` 进行分组PHP 中,可以通过 `array_filter` 和 `array_pluck` 函数来实现分组操作。以下是一个示例: ```php foreach ($obj_visit_doctor as $key => $value) { $doctor_am = array_filter($value, function ($doctor) { return $doctor['time'] == 1; }); $doctor_pm = array_filter($value, function ($doctor) { return $doctor['time'] == 2; }); $obj_visit_doctor[$key] = [ '1' => array_pluck($doctor_am, 'doctor_id'), '2' => array_pluck($doctor_pm, 'doctor_id') ]; } ``` ### 总结 根据列表中的某个字段进行分组操作,可以使用不同的编程语言提供的内置函数或数据结构来实现。每种语言都有其独特的实现方式,但核心思想是相似的:通过遍历数据,根据指定字段的值将数据分组存储。选择合适的方法可以提高代码的可读性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值