You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于玩家分数数组实现按周或按月统计得分总和

按周/按月统计玩家得分总和的实现方案

嘿,这个需求很常见,我给你整理两种直接能用的实现方式——按月统计和按周统计,附带详细解释:

首先先明确你的原始数据结构(我帮你补全了最后一条数据方便测试):

$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:27:37