基于玩家分数数组实现按周或按月统计得分总和
按周/按月统计玩家得分总和的实现方案
嘿,这个需求很常见,我给你整理两种直接能用的实现方式——按月统计和按周统计,附带详细解释:
首先先明确你的原始数据结构(我帮你补全了最后一条数据方便测试):
$a = [ ['date' => '09-04-2018','item' => 'player 1', 'score' => '1'], ['date' => '09-04-2018','item' => 'player 2', 'score' => '2'], ['date' => '10-04-2018','item' => 'player 1', 'score' => '1'], ['date' => '10-04-2018','item' => 'player 2', 'score' => '2'], ['date' => '16-04-2018','item' => 'player 1', 'score' => '3'], ['date' => '16-04-2018','item' => 'player 2', 'score' => '4'], ];
核心思路是:把日期字符串转换成可识别的日期格式,提取出「年月」或「年周」作为分组标识,再按玩家+分组标识来累加得分。
一、按月统计得分总和
我们用DateTime类解析日期,用Y-m格式(比如2018-04)作为月份的唯一标识,嵌套数组存储每个玩家的月度总分:
// 初始化月度统计结果数组 $monthlyStats = []; foreach ($a as $entry) { // 解析dd-mm-yyyy格式的日期 $date = DateTime::createFromFormat('d-m-Y', $entry['date']); // 获取年月标识,比如"2018-04" $monthKey = $date->format('Y-m'); $player = $entry['item']; // 把得分转成整数,避免字符串拼接错误 $score = (int)$entry['score']; // 如果玩家当月记录不存在,先初始化为0 if (!isset($monthlyStats[$monthKey][$player])) { $monthlyStats[$monthKey][$player] = 0; } // 累加得分 $monthlyStats[$monthKey][$player] += $score; } // 输出统计结果 print_r($monthlyStats);
运行后会得到清晰的月度统计:
Array ( [2018-04] => Array ( [player 1] => 5 [player 2] => 8 ) )
二、按周统计得分总和
逻辑和按月统计类似,只是把分组标识换成Y-W(年+周数,比如2018-15代表2018年第15周)。注意PHP的周数默认从周一开始计算,如果需要按周日为一周起点,可以调整格式或手动处理:
// 初始化周度统计结果数组 $weeklyStats = []; foreach ($a as $entry) { $date = DateTime::createFromFormat('d-m-Y', $entry['date']); // 获取年周标识,比如"2018-15" $weekKey = $date->format('Y-W'); $player = $entry['item']; $score = (int)$entry['score']; if (!isset($weeklyStats[$weekKey][$player])) { $weeklyStats[$weekKey][$player] = 0; } $weeklyStats[$weekKey][$player] += $score; } // 输出统计结果 print_r($weeklyStats);
运行结果示例:
Array ( [2018-15] => Array ( [player 1] => 2 [player 2] => 4 ) [2018-16] => Array ( [player 1] => 3 [player 2] => 4 ) )
额外实用提示
- 如果你的日期格式有变化,记得调整
createFromFormat的第一个参数,比如yyyy-mm-dd格式就改成Y-m-d; - 如果得分可能是小数,把
(int)换成(float)即可; - 可以把统计逻辑封装成复用函数:
function calculatePlayerStats($data, $groupType = 'month') { $stats = []; // 根据分组类型选择日期格式 $dateFormat = $groupType === 'month' ? 'Y-m' : 'Y-W'; foreach ($data as $entry) { $date = DateTime::createFromFormat('d-m-Y', $entry['date']); $groupKey = $date->format($dateFormat); $player = $entry['item']; $score = (int)$entry['score']; if (!isset($stats[$groupKey][$player])) { $stats[$groupKey][$player] = 0; } $stats[$groupKey][$player] += $score; } return $stats; } // 调用示例 $monthlyStats = calculatePlayerStats($a, 'month'); $weeklyStats = calculatePlayerStats($a, 'week');
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

