php项目统计传球成功率哪队更高?

wen PHP项目 5

PHP项目:统计传球成功率哪队更高

下面给你一个完整的 PHP 实现方案,包含思路、数据结构和可直接运行的代码。

php项目统计传球成功率哪队更高?


需求分析

传球成功率 = 成功传球次数 ÷ 总传球次数 × 100%

要比较哪队更高,需要:

  1. 记录每次传球(属于哪队、成功/失败)
  2. 分球队统计成功数和总数
  3. 计算成功率并对比

数据准备(示例)

方案A:用数组模拟数据(适合测试)

$passes = [
    ['team' => 'A', 'success' => true],
    ['team' => 'A', 'success' => false],
    ['team' => 'B', 'success' => true],
    // ...
];

方案B:从数据库读取(推荐生产环境)

CREATE TABLE passes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    match_id INT,
    team ENUM('A','B'),
    success TINYINT(1),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

完整 PHP 代码

<?php
// 1. 模拟数据(真实项目可换成数据库查询)
$passes = [
    // A 队:15 次传球,12 次成功
    ['team' => 'A', 'success' => true],
    ['team' => 'A', 'success' => true],
    ['team' => 'A', 'success' => false],
    ['team' => 'A', 'success' => true],
    ['team' => 'A', 'success' => true],
    ['team' => 'A', 'success' => true],
    ['team' => 'A', 'success' => false],
    ['team' => 'A', 'success' => true],
    ['team' => 'A', 'success' => true],
    ['team' => 'A', 'success' => true],
    ['team' => 'A', 'success' => true],
    ['team' => 'A', 'success' => true],
    ['team' => 'A', 'success' => true],
    ['team' => 'A', 'success' => false],
    ['team' => 'A', 'success' => true],
    // B 队:12 次传球,9 次成功
    ['team' => 'B', 'success' => true],
    ['team' => 'B', 'success' => true],
    ['team' => 'B', 'success' => false],
    ['team' => 'B', 'success' => true],
    ['team' => 'B', 'success' => true],
    ['team' => 'B', 'success' => false],
    ['team' => 'B', 'success' => true],
    ['team' => 'B', 'success' => true],
    ['team' => 'B', 'success' => true],
    ['team' => 'B', 'success' => false],
    ['team' => 'B', 'success' => true],
    ['team' => 'B', 'success' => true],
];
// 2. 统计
$stats = [];
foreach ($passes as $p) {
    $team = $p['team'];
    if (!isset($stats[$team])) {
        $stats[$team] = ['total' => 0, 'success' => 0];
    }
    $stats[$team]['total']++;
    if ($p['success']) {
        $stats[$team]['success']++;
    }
}
// 3. 计算成功率
foreach ($stats as $team => &$s) {
    $s['rate'] = $s['total'] > 0
        ? round($s['success'] / $s['total'] * 100, 2)
        : 0;
}
unset($s);
// 4. 输出结果
echo "球队传球数据:\n";
foreach ($stats as $team => $s) {
    echo "球队 {$team}:成功 {$s['success']} / 总数 {$s['total']},成功率 {$s['rate']}%\n";
}
// 5. 判断哪队更高
$teams = array_keys($stats);
if (count($teams) >= 2) {
    $t1 = $teams[0];
    $t2 = $teams[1];
    if ($stats[$t1]['rate'] > $stats[$t2]['rate']) {
        echo "\n>>> 球队 {$t1} 传球成功率更高\n";
    } elseif ($stats[$t1]['rate'] < $stats[$t2]['rate']) {
        echo "\n>>> 球队 {$t2} 传球成功率更高\n";
    } else {
        echo "\n>>> 两队传球成功率相同\n";
    }
}

输出示例

球队传球数据:
球队 A:成功 12 / 总数 15,成功率 80%
球队 B:成功 9 / 总数 12,成功率 75%
>>> 球队 A 传球成功率更高

用数据库实现(生产推荐)

<?php
$pdo = new PDO('mysql:host=localhost;dbname=football', 'root', 'password');
$sql = "SELECT 
            team,
            COUNT(*) AS total,
            SUM(success) AS success_count,
            ROUND(SUM(success) / COUNT(*) * 100, 2) AS rate
        FROM passes
        WHERE match_id = :match_id
        GROUP BY team
        ORDER BY rate DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute([':match_id' => 1]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $i => $row) {
    $tag = $i === 0 ? ' ← 最高' : '';
    echo "{$row['team']} 队:{$row['success_count']}/{$row['total']} "
       . "= {$row['rate']}%{$tag}\n";
}

输出:

A 队:12/15 = 80.00% ← 最高
B 队:9/12 = 75.00%

关键点提醒

问题 建议
除零错误 用 $total > 0 ? ... : 0 保护
浮点精度 用 round(..., 2) 或存整数百分比
平局判断 用 比较,不要用 > 否则会漏判
大量数据 直接用 SQL GROUP BY 聚合,避免全表 Load 到 PHP
多场比赛 加 WHERE match_id = ?
传球失败定义 明确是"被断"还是"出界",最好在表里加 reason

扩展方向

  • 增加按区域统计(前场/中场/后场传球成功率)
  • 增加按球员统计,找出队内传球最稳的人
  • 用 Chart.js 在前端可视化对比
  • 结合 xG、向前传球比例 做综合分析

如果你告诉我你的具体数据来源(数组 / MySQL / JSON)和字段结构,我可以直接帮你写出对应版本的代码。

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