本文目录导读:

在PHP项目中统计哪支球队的红黄牌数量更多,通常取决于你的数据结构(是数组、数据库还是API)。
下面我提供几种最常见的解决方案,从简单到复杂。
数据是 PHP 数组(最直接)
假设你有一个数组,包含每场比赛的球员和牌信息。
<?php
$matches = [
[
'home' => '皇家马德里',
'away' => '巴塞罗那',
'cards' => [
['team' => 'home', 'type' => 'yellow'], // 主队黄牌
['team' => 'away', 'type' => 'red'], // 客队红牌
['team' => 'home', 'type' => 'yellow'],
['team' => 'away', 'type' => 'yellow'],
['team' => 'home', 'type' => 'red'],
]
],
[
'home' => '皇家马德里',
'away' => '马德里竞技',
'cards' => [
['team' => 'home', 'type' => 'yellow'],
['team' => 'home', 'type' => 'yellow'],
['team' => 'away', 'type' => 'yellow'],
]
]
];
// 统计逻辑
$teamCards = []; // 用于存放每个队的黄红牌数
foreach ($matches as $match) {
$homeName = $match['home'];
$awayName = $match['away'];
// 初始化球队数据
if (!isset($teamCards[$homeName])) {
$teamCards[$homeName] = ['yellow' => 0, 'red' => 0];
}
if (!isset($teamCards[$awayName])) {
$teamCards[$awayName] = ['yellow' => 0, 'red' => 0];
}
foreach ($match['cards'] as $card) {
// 判断是主队还是客队
$teamName = ($card['team'] === 'home') ? $homeName : $awayName;
if ($card['type'] === 'red') {
$teamCards[$teamName]['red']++;
} else {
$teamCards[$teamName]['yellow']++;
}
}
}
// 找出红黄牌总数最多的队(假设红牌记2分,黄牌记1分,进行加权排序)
$totalScore = [];
foreach ($teamCards as $team => $cards) {
$totalScore[$team] = ($cards['red'] * 2) + $cards['yellow'];
}
// 按总分降序排序
arsort($totalScore);
$topTeam = array_key_first($totalScore);
echo "红黄牌总数最多的球队是:" . $topTeam . " (红牌: {$teamCards[$topTeam]['red']}, 黄牌: {$teamCards[$topTeam]['yellow']})" . PHP_EOL;
?>
数据在 MySQL 数据库中
假设有 matches 表(比赛)和 cards 表(牌)。
通常数据库中记录的是球员ID或直接记录球队ID。
SQL 查询方案: 如果最简单,直接用SQL统计并按总数排序。
SELECT
t.team_name,
SUM(CASE WHEN c.card_type = 'red' THEN 1 ELSE 0 END) AS red_count,
SUM(CASE WHEN c.card_type = 'yellow' THEN 1 ELSE 0 END) AS yellow_count,
(SUM(CASE WHEN c.card_type = 'red' THEN 1 ELSE 0 END) * 2 +
SUM(CASE WHEN c.card_type = 'yellow' THEN 1 ELSE 0 END)) AS total_score
FROM cards c
JOIN teams t ON c.team_id = t.id
GROUP BY t.team_name
ORDER BY total_score DESC
LIMIT 1; -- 最多的一队
PHP执行代码:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass');
$sql = "
SELECT
t.team_name,
SUM(c.card_type = 'red') AS red_count,
SUM(c.card_type = 'yellow') AS yellow_count,
(SUM(c.card_type = 'red') * 2 + SUM(c.card_type = 'yellow')) AS total_score
FROM cards c
JOIN teams t ON c.team_id = t.id
GROUP BY t.team_name
ORDER BY total_score DESC
LIMIT 1
";
$stmt = $pdo->query($sql);
$topTeam = $stmt->fetch(PDO::FETCH_ASSOC);
echo "最多的是: " . $topTeam['team_name'] .
" (红牌: " . $topTeam['red_count'] .
", 黄牌: " . $topTeam['yellow_count'] . ")";
?>
计算“哪队更多”的不同算法(加权)
因为红牌比黄牌严重得多,单纯比较总数(如2黄 = 1红)不够合理,业务上通常使用“纪律积分”:
- 红牌 = 3分 (或2分)
- 黄牌 = 1分
修改PHP逻辑: 把场景一里的积分权重改一下即可。
$totalScore[$team] = ($cards['red'] * 3) + ($cards['yellow'] * 1);
如果只看“单纯数量”(不算权重)
如果你只想看 黄牌+红牌次数总和,不管严重性:
// 修改排序权重为: $totalScore[$team] = $cards['red'] + $cards['yellow'];
或者直接在SQL里:
ORDER BY (red_count + yellow_count) DESC
总结建议
- 确认数据结构:你是直接操作数组还是数据库?
- 定义“更多”标准:是看总张数,还是红牌权重更大?
- 输出结果:如果同时有多队并列,你去
array_key_first只能拿一个,可以改为循环输出所有等于最高分的队。
如果你能提供具体的数据表结构或数组示例,我可以帮你写更精确的代码,哪种情况符合你的需求?