我来帮您写一个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();
}
您可以根据实际需求选择合适的使用方式!