本文目录导读:

在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只能拿一个,可以改为循环输出所有等于最高分的队。
如果你能提供具体的数据表结构或数组示例,我可以帮你写更精确的代码,哪种情况符合你的需求?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播