php项目统计冲刺跑次数谁更多?

wen PHP项目 1

我来帮您写一个PHP脚本来统计两个或多个用户中谁的冲刺跑次数更多。

php项目统计冲刺跑次数谁更多?

<?php
/**
 * 冲刺跑次数统计比较器
 * 支持比较多个用户的冲刺跑次数
 */
class SprintStats {
    private $userStats = [];
    /**
     * 添加用户冲刺跑数据
     * @param string $userName 用户名
     * @param int $sprintCount 冲刺跑次数
     */
    public function addUserSprint($userName, $sprintCount) {
        if (!is_int($sprintCount) || $sprintCount < 0) {
            throw new InvalidArgumentException("冲刺跑次数必须是大于等于0的整数");
        }
        $this->userStats[$userName] = $sprintCount;
    }
    /**
     * 获取统计数据
     * @return array 排序后的统计数据
     */
    public function getStatistics() {
        if (empty($this->userStats)) {
            return ['error' => '暂无数据'];
        }
        // 按次数降序排序
        arsort($this->userStats);
        $result = [
            'ranking' => [],
            'winner' => null,
            'maxCount' => 0
        ];
        // 填充排名数据
        foreach ($this->userStats as $user => $count) {
            $result['ranking'][] = [
                'username' => $user,
                'sprint_count' => $count
            ];
            // 找出最大次数
            if ($count > $result['maxCount']) {
                $result['maxCount'] = $count;
                $result['winner'] = $user;
            }
            // 如果有并列第一
            if ($count == $result['maxCount'] && $result['winner'] !== $user) {
                $result['tied'] = true;
            }
        }
        return $result;
    }
    /**
     * 快速比较两个用户
     */
    public static function compareTwo($userA, $countA, $userB, $countB) {
        $stats = new self();
        $stats->addUserSprint($userA, $countA);
        $stats->addUserSprint($userB, $countB);
        return $stats->getStatistics();
    }
}
// ==================== 使用示例 ====================
// 示例1: 比较两个用户
echo "=== 两人比较示例 ===\n";
$result = SprintStats::compareTwo('小明', 15, '小红', 12);
$winner = $result['winner'];
$rankings = $result['ranking'];
echo "比较结果:\n";
foreach ($rankings as $rank => $person) {
    $medal = $rank == 0 ? "🥇" : ($rank == 1 ? "🥈" : "🥉");
    echo "  $medal {$person['username']}: {$person['sprint_count']}次\n";
}
echo "最终胜者: $winner\n\n";
// 示例2: 比较三个用户
echo "=== 三人比较示例 ===\n";
$stats = new SprintStats();
$stats->addUserSprint('张三', 20);
$stats->addUserSprint('李四', 25);
$stats->addUserSprint('王五', 18);
$result2 = $stats->getStatistics();
echo "排名结果:\n";
foreach ($result2['ranking'] as $rank => $person) {
    $medal = $rank == 0 ? "🥇" : ($rank == 1 ? "🥈" : "🥉");
    echo "  $medal {$person['username']}: {$person['sprint_count']}次\n";
}
echo "冲刺王: {$result2['winner']} 共{$result2['maxCount']}次\n\n";
// 示例3: 从数据库查询比较
echo "=== 数据库查询示例(模拟)===\n";
function compareFromDatabase($pdo, $userId1, $userId2) {
    // 模拟数据库查询
    $query = "SELECT user_id, COUNT(*) as sprint_count 
              FROM sprint_records 
              WHERE user_id IN (?, ?) 
              GROUP BY user_id 
              ORDER BY sprint_count DESC";
    // 这里简化模拟数据
    $mockData = [
        ['user_id' => 1, 'username' => '用户A', 'sprint_count' => 30],
        ['user_id' => 2, 'username' => '用户B', 'sprint_count' => 28],
    ];
    $stats = new SprintStats();
    foreach ($mockData as $row) {
        $stats->addUserSprint($row['username'], $row['sprint_count']);
    }
    return $stats->getStatistics();
}
// 示例4: 完全动态比较
echo "=== 动态添加数据比较 ===\n";
$stats = new SprintStats();
$users = [
    'Runner1' => 8,
    'Runner2' => 12,
    'Runner3' => 35,
    'Runner4' => 12,
    'Runner5' => 24,
];
foreach ($users as $name => $count) {
    $stats->addUserSprint($name, $count);
}
$result3 = $stats->getStatistics();
echo "总的冲刺跑排行榜:\n";
foreach ($result3['ranking'] as $rank => $person) {
    echo "  #".($rank+1)." {$person['username']}: {$person['sprint_count']}次\n";
}
echo "最勤奋的跑者: {$result3['winner']}\n";
// 检查是否有并列
if (isset($result3['tied']) && $result3['tied']) {
    echo "⚠️ 存在并列第一的情况!\n";
    $max = $result3['maxCount'];
    $tiedUsers = array_filter($result3['ranking'], function($item) use ($max) {
        return $item['sprint_count'] == $max;
    });
    echo "并列的选手:";
    $names = array_column($tiedUsers, 'username');
    echo implode(', ', $names) . "\n";
}
// ==================== 带命令行交互的版本 ====================
/**
 * 命令行版本:输入姓名和次数直接比较
 */
function cliCompare() {
    echo "请输入第一个人的姓名: ";
    $name1 = trim(fgets(STDIN));
    echo "请输入 {$name1} 的冲刺跑次数: ";
    $count1 = (int)trim(fgets(STDIN));
    echo "请输入第二个人的姓名: ";
    $name2 = trim(fgets(STDIN));
    echo "请输入 {$name2} 的冲刺跑次数: ";
    $count2 = (int)trim(fgets(STDIN));
    $result = SprintStats::compareTwo($name1, $count1, $name2, $count2);
    echo "\n=== 比较结果 ===\n";
    if ($count1 > $count2) {
        echo "🏆 {$name1} 的冲刺跑次数({$count1}次)比 {$name2}({$count2}次)更多!\n";
    } elseif ($count2 > $count1) {
        echo "🏆 {$name2} 的冲刺跑次数({$count2}次)比 {$name1}({$count1}次)更多!\n";
    } else {
        echo "🤝 双方打平!都是{$count1}次!\n";
    }
}
// 取消下面的注释来运行命令行交互版本
// cliCompare();
// ==================== Web输出版本 ====================
/**
 * HTML表格输出版本
 */
function generateHtmlTable() {
    $stats = new SprintStats();
    $stats->addUserSprint('小明', 45);
    $stats->addUserSprint('小红', 38);
    $stats->addUserSprint('小刚', 52);
    $stats->addUserSprint('小李', 45);
    $result = $stats->getStatistics();
    $html = '<!DOCTYPE html>
    <html>
    <head>
        <style>
            table { border-collapse: collapse; width: 100%; }
            th, td { border: 1px solid #ddd; padding: 8px; text-align: center; }
            th { background-color: #f2f2f2; }
            .winner { background-color: #ffd700; font-weight: bold; }
        </style>
    </head>
    <body>';
    $html .= "<h2>🏃 冲刺跑排行榜</h2>";
    $html .= "<table>";
    $html .= "<tr><th>排名</th><th>姓名</th><th>冲刺次数</th></tr>";
    foreach ($result['ranking'] as $rank => $person) {
        $class = isset($person['username']) && $person['username'] == $result['winner'] ? 'winner' : '';
        $html .= "<tr class='$class'>";
        $html .= "<td>#".($rank+1)."</td>";
        $html .= "<td>{$person['username']}</td>";
        $html .= "<td>{$person['sprint_count']} 次</td>";
        $html .= "</tr>";
    }
    $html .= "</table>";
    $html .= "<h3>🏆 冲刺王: {$result['winner']}</h3>";
    $html .= '</body></html>';
    return $html;
}
// 取消下面的注释来输出HTML表格
// echo generateHtmlTable();
?>

主要功能说明:

基础比较功能

  • compareTwo($userA, $countA, $userB, $countB) - 快速比较两个人

多用户比较

  • addUserSprint($userName, $sprintCount) - 添加多个用户的冲刺数据
  • getStatistics() - 获取完整的排名统计

特色功能

  • 支持并列情况的检测
  • 自动排序显示排名
  • 清晰的输出格式(CLI和HTML两种模式)

使用场景

  • 直接比较:快速查看A和B谁的冲刺次数多
  • 排行榜:多个用户之间的排名比较
  • 数据库集成:可以从数据库查询后进行比较

扩展建议

如果要对接数据库,可以这样使用:

// 数据库版本示例
function compareFromDB($pdo) {
    $stmt = $pdo->query("
        SELECT u.name, COUNT(s.id) as sprint_count 
        FROM users u 
        LEFT JOIN sprint_records s ON u.id = s.user_id 
        GROUP BY u.id 
        ORDER BY sprint_count DESC
    ");
    $stats = new SprintStats();
    while ($row = $stmt->fetch()) {
        $stats->addUserSprint($row['name'], $row['sprint_count']);
    }
    return $stats->getStatistics();
}

您可以根据实际需求选择合适的使用方式!

抱歉,评论功能暂时关闭!