PHP 项目统计传球成功率哪队更高
下面给你一个完整的 PHP 实现方案,用于统计两支球队的传球成功率并判断哪队更高。

数据准备
假设你有一个传球记录表 passes:
CREATE TABLE passes (
id INT PRIMARY KEY AUTO_INCREMENT,
match_id INT,
team VARCHAR(50), -- 球队名称
player VARCHAR(50), -- 传球球员
is_success TINYINT(1) -- 1=成功 0=失败
);
示例数据:
| team | is_success |
|---|---|
| 红队 | 1 |
| 红队 | 0 |
| 蓝队 | 1 |
| 蓝队 | 1 |
纯 PHP 数组统计(不依赖数据库)
<?php
// 模拟传球数据
$passes = [
['team' => '红队', 'is_success' => 1],
['team' => '红队', 'is_success' => 1],
['team' => '红队', 'is_success' => 0],
['team' => '红队', 'is_success' => 1],
['team' => '蓝队', 'is_success' => 1],
['team' => '蓝队', 'is_success' => 0],
['team' => '蓝队', 'is_success' => 0],
['蓝队' => '蓝队', 'is_success' => 1], // 注意这里应为 'team'
];
// 统计每队总传球数和成功数
$stats = [];
foreach ($passes as $p) {
$team = $p['team'];
if (!isset($stats[$team])) {
$stats[$team] = ['total' => 0, 'success' => 0];
}
$stats[$team]['total']++;
if ($p['is_success'] == 1) {
$stats[$team]['success']++;
}
}
// 计算成功率
$rates = [];
foreach ($stats as $team => $s) {
$rates[$team] = $s['total'] > 0
? round($s['success'] / $s['total'] * 100, 2)
: 0;
echo "{$team}: 传球 {$s['total']} 次,成功 {$s['success']} 次,成功率 {$rates[$team]}%\n";
}
// 判断哪队更高
arsort($rates);
$teams = array_keys($rates);
if (count($rates) >= 2 && $rates[$teams[0]] == $rates[$teams[1]]) {
echo "两队传球成功率相同!\n";
} else {
echo "传球成功率更高的是:{$teams[0]},成功率 {$rates[$teams[0]]}%\n";
}
数据库版本(PDO)
<?php
$pdo = new PDO('mysql:host=localhost;dbname=football;charset=utf8mb4', 'root', '123456');
$matchId = 1001;
// MySQL 直接聚合计算
$sql = "SELECT team,
COUNT(*) AS total,
SUM(is_success) AS success,
ROUND(SUM(is_success) / COUNT(*) * 100, 2) AS rate
FROM passes
WHERE match_id = ?
GROUP BY team
ORDER BY rate DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute([$matchId]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $r) {
echo "{$r['team']}: {$r['success']}/{$r['total']} = {$r['rate']}%\n";
}
// 判断
if (count($rows) >= 2) {
if ($rows[0]['rate'] == $rows[1]['rate']) {
echo "两队传球成功率相同!\n";
} else {
echo "传球成功率更高的是:{$rows[0]['team']}\n";
}
}
关键点说明
| 项目 | 说明 |
|---|---|
| 成功率公式 | 成功次数 / 总传球次数 × 100% |
| 排序 | 用 arsort() 或 SQL ORDER BY rate DESC |
| 并列情况 | 需判断前两名成功率是否相等 |
| 防止除零 | 总数>0 时才计算比率 |
| 精度 | round(..., 2) 保留两位小数 |
扩展建议
- 按比赛维度统计:加
WHERE match_id = ? - 按半场统计:加
half字段 - 可视化:输出 JSON 给前端用 ECharts 画柱状图
- 缓存:高频查询可写入 Redis
需要我帮你扩展成 按球员统计、按比赛分半场统计 或 API 接口版本 吗?