php项目统计门前抢点射门次数对比?

wen PHP项目 4

本文目录导读:

php项目统计门前抢点射门次数对比?

  1. 数据来源假设
  2. 数据库表结构设计 (MySQL)
  3. PHP核心统计逻辑 (ShotStats.php)
  4. 前端可视化对比 (示例:使用Chart.js)
  5. 进阶功能
  6. 注意事项

在PHP项目中统计门前抢点射门次数对比,通常涉及前端事件追踪(如视频分析、传感器数据)和后端数据处理(如数据库存储、统计分析),由于“门前抢点射门”是足球比赛中的特定战术动作,需要明确数据来源(如人工录入、AI识别或第三方API)。

以下是一个完整的PHP后端实现方案,包含设计思路、数据库结构、核心统计逻辑和可视化对比示例:


数据来源假设

  • 人工录入:教练/分析师通过后台表单输入每次射门类型(抢点射门其他射门)及位置坐标。
  • 传感器/视频分析:通过API接收结构化JSON数据,
    {
    "match_id": 1001,
    "team_id": 5,
    "player_id": 23,
    "event_type": "shot",
    "shot_type": "poacher",  // 抢点射门
    "x_coordinate": 0.85,    // 相对球场宽度比例(0-1)
    "y_coordinate": 0.52,    // 相对球场长度比例(0-1)
    "is_goal": true
    }

数据库表结构设计 (MySQL)

-- 球队表
CREATE TABLE teams (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL
);
-- 球员表
CREATE TABLE players (
    id INT PRIMARY KEY AUTO_INCREMENT,
    team_id INT NOT NULL,
    name VARCHAR(50) NOT NULL,
    FOREIGN KEY (team_id) REFERENCES teams(id)
);
-- 射门事件表
CREATE TABLE shot_events (
    id INT PRIMARY KEY AUTO_INCREMENT,
    match_id INT NOT NULL,
    team_id INT NOT NULL,
    player_id INT NOT NULL,
    shot_type ENUM('poacher', 'normal') NOT NULL,  -- poacher=抢点射门
    x_pos DECIMAL(5,4) NOT NULL,
    y_pos DECIMAL(5,4) NOT NULL,
    is_goal BOOLEAN DEFAULT false,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (team_id) REFERENCES teams(id),
    FOREIGN KEY (player_id) REFERENCES players(id)
);

PHP核心统计逻辑 (ShotStats.php)

<?php
class ShotStats {
    private $pdo;
    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
    }
    /**
     * 获取两队抢点射门统计对比
     * @param int $matchId 比赛ID
     * @return array 统计结果
     */
    public function comparePoacherShots($matchId) {
        $sql = "
            SELECT 
                t.id AS team_id,
                t.name AS team_name,
                COUNT(se.id) AS total_shots,
                SUM(CASE WHEN se.shot_type = 'poacher' THEN 1 ELSE 0 END) AS poacher_shots,
                SUM(CASE WHEN se.shot_type = 'normal' THEN 1 ELSE 0 END) AS normal_shots,
                SUM(CASE WHEN se.shot_type = 'poacher' AND se.is_goal THEN 1 ELSE 0 END) AS poacher_goals,
                ROUND(
                    (SUM(CASE WHEN se.shot_type = 'poacher' THEN 1 ELSE 0 END) / COUNT(se.id)) * 100, 
                    2
                ) AS poacher_percentage
            FROM shot_events se
            INNER JOIN teams t ON se.team_id = t.id
            WHERE se.match_id = :matchId
            GROUP BY t.id, t.name
            ORDER BY poacher_shots DESC
        ";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute([':matchId' => $matchId]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    /**
     * 获取某队最近N场比赛的抢点射门趋势
     */
    public function getPoacherTrend($teamId, $limit = 10) {
        $sql = "
            SELECT 
                match_id,
                SUM(CASE WHEN shot_type = 'poacher' THEN 1 ELSE 0 END) AS poacher_shots,
                SUM(CASE WHEN shot_type = 'poacher' AND is_goal THEN 1 ELSE 0 END) AS poacher_goals
            FROM shot_events
            WHERE team_id = :teamId
            GROUP BY match_id
            ORDER BY created_at DESC
            LIMIT :limit
        ";
        $stmt = $this->pdo->prepare($sql);
        $stmt->bindValue(':teamId', $teamId, PDO::PARAM_INT);
        $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
        $stmt->execute();
        return array_reverse($stmt->fetchAll(PDO::FETCH_ASSOC)); // 按时间正序
    }
    /**
     * 获取单场比赛中双方抢点射门的空间分布(用于热力图)
     */
    public function getPoacherSpatialData($matchId) {
        $sql = "
            SELECT 
                team_id,
                x_pos,
                y_pos,
                shot_type,
                is_goal
            FROM shot_events
            WHERE match_id = :matchId AND shot_type = 'poacher'
        ";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute([':matchId' => $matchId]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}
?>

前端可视化对比 (示例:使用Chart.js)

<?php
// 接入控制器
require 'ShotStats.php';
$pdo = new PDO('mysql:host=localhost;dbname=football', 'user', 'pass');
$stats = new ShotStats($pdo);
$matchId = 1001;
$matchStats = $stats->comparePoacherShots($matchId);
?>
<!-- 横柱状图对比 -->
<!DOCTYPE html>
<html>
<head>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
    <canvas id="shotChart" width="800" height="400"></canvas>
    <script>
        const data = <?= json_encode($matchStats); ?>;
        const labels = data.map(item => item.team_name);
        const poacherShots = data.map(item => parseInt(item.poacher_shots));
        const normalShots = data.map(item => parseInt(item.normal_shots));
        new Chart(document.getElementById('shotChart'), {
            type: 'bar',
            data: {
                labels: labels,
                datasets: [
                    {
                        label: '抢点射门',
                        data: poacherShots,
                        backgroundColor: 'rgba(255, 99, 132, 0.6)'
                    },
                    {
                        label: '普通射门',
                        data: normalShots,
                        backgroundColor: 'rgba(54, 162, 235, 0.6)'
                    }
                ]
            },
            options: {
                indexAxis: 'y',
                plugins: {
                    title: {
                        display: true,
                        text: '双方抢点射门次数对比'
                    }
                },
                scales: {
                    x: {
                        title: {
                            display: true,
                            text: '射门次数'
                        }
                    }
                }
            }
        });
    </script>
</body>
</html>

进阶功能

  • 实时统计:使用WebSocket或轮询API刷新数据。
  • 热力图:使用getPoacherSpatialData()结合前端热力图库(如Heatmap.js)展示射门位置。
  • 效率对比:计算抢点射门转化率 = poacher_goals / poacher_shots
  • AI自动识别:对接计算机视觉API(如AWS Rekognition)自动标记射门类型。

注意事项

  1. 数据准确性:确保shot_type字段由统一标准定义(如抢点射门 = 近距离射门 < 6码)。
  2. 索引优化:对match_idteam_idshot_type建立复合索引。
  3. 缓存:对于高频查询,使用Redis缓存统计结果。

通过以上方案,您可以实现基于PHP的抢点射门对比统计,支持前端动态展示和深入分析,根据实际需求调整字段和统计粒度即可。

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