如何按国家与性别分组二维数组并计算活跃度得分平均值
解决方案:按国家+性别分组计算活跃度得分平均值
嘿,这个需求很常见,我来给你一个清晰的实现方案,直接用PHP就能搞定!
核心思路
我们需要先按**国家(country)+性别(gender)**的组合对用户进行分组,记录每个分组的总活跃度得分和用户数量,最后用总分除以人数得到平均值。这样既高效又容易理解。
完整代码实现
$users = [ ['id' => 1, 'gender' => 'M', 'dob' => 1990, 'country' => 'IN', 'activity_score' => 34], ['id' => 2, 'gender' => 'M', 'dob' => 1980, 'country' => 'US', 'activity_score' => 9], ['id' => 3, 'gender' => 'F', 'dob' => 1993, 'country' => 'UK', 'activity_score' => 45], ['id' => 4, 'gender' => 'M', 'dob' => 1998, 'country' => 'IN', 'activity_score' => 0], // 可以继续添加更多用户数据 ]; // 初始化分组统计数组,存储每个分组的总分、人数、国家和性别 $groupStats = []; foreach ($users as $user) { // 生成唯一分组标识:用下划线拼接国家和性别,确保每个组合唯一 $groupKey = $user['country'] . '_' . $user['gender']; // 如果分组不存在,先初始化统计数据 if (!isset($groupStats[$groupKey])) { $groupStats[$groupKey] = [ 'total_score' => 0, 'count' => 0, 'country' => $user['country'], 'gender' => $user['gender'] ]; } // 累加当前用户的活跃度得分和人数 $groupStats[$groupKey]['total_score'] += $user['activity_score']; $groupStats[$groupKey]['count']++; } // 计算每个分组的平均值,整理成最终结果 $averageScores = []; foreach ($groupStats as $stat) { // 避免除以0的异常情况(比如某个分组没有用户数据) $average = $stat['count'] > 0 ? $stat['total_score'] / $stat['count'] : 0; $averageScores[] = [ 'country' => $stat['country'], 'gender' => $stat['gender'], 'average_activity_score' => round($average, 2) // 保留两位小数,可按需调整精度 ]; } // 打印结果,或者根据业务需求进一步处理 print_r($averageScores);
代码解释
分组统计阶段:
- 用
$groupStats数组追踪每个分组的核心数据:总分、用户数、国家和性别。 - 用
国家_性别作为唯一键,确保每个组合(比如IN-M、US-M)只会被统计一次。
- 用
平均值计算阶段:
- 遍历统计好的分组数据,用总分除以人数得到平均值。
- 加入了
$stat['count'] > 0的判断,避免出现除以0的报错情况。 - 用
round($average, 2)把结果保留两位小数,让输出更整洁,你可以根据需求改成保留一位或者不保留小数。
额外小技巧
- 如果觉得字符串拼接的分组键不够直观,也可以用数组作为键(PHP支持数组作为数组键):
$groupKey = [$user['country'], $user['gender']]; - 如果需要对结果排序(比如按国家名称、性别或者平均值排序),可以用
usort函数:// 按国家名称升序排序 usort($averageScores, function($a, $b) { return strcmp($a['country'], $b['country']); });
内容的提问来源于stack exchange,提问作者susana
相关产品推荐
相关产品推荐

