php项目统计转身过人次数谁多?

wen PHP项目 16

PHP 项目统计“转身过人”次数谁多?

你说的应该是 NBA/篮球数据统计 里“转身过人”这种技术动作的统计吧?下面给你一个完整的 PHP 实现思路和代码示例。

php项目统计转身过人次数谁多?


需求分析

要统计谁转身过人次数最多,需要:

  1. 数据表:记录每次转身过人动作(球员 + 动作类型 + 时间)
  2. 统计逻辑:按球员分组,统计 动作类型 = '转身过人' 的次数
  3. 排序:按次数降序,取第一名或排行榜

数据库设计

-- 球员表
CREATE TABLE players (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL
);
-- 动作记录表
CREATE TABLE actions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    player_id INT NOT NULL,
    action_type VARCHAR(30) NOT NULL,   -- 如 '转身过人'
    match_id INT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (player_id) REFERENCES players(id)
);

插入测试数据:

INSERT INTO players (name) VALUES ('张三'), ('李四'), ('王五');
INSERT INTO actions (player_id, action_type) VALUES
(1, '转身过人'), (1, '转身过人'), (1, '转身过人'),
(2, '转身过人'), (2, '转身过人'),
(3, '转身过人'),
(1, '传球'), (2, '投篮');

PHP 统计代码

方式 1:纯 SQL 统计(推荐)

<?php
$pdo = new PDO('mysql:host=localhost;dbname=basketball;charset=utf8mb4', 'root', 'password');
$sql = "
    SELECT p.id, p.name, COUNT(a.id) AS turn_count
    FROM players p
    JOIN actions a ON a.player_id = p.id
    WHERE a.action_type = '转身过人'
    GROUP BY p.id, p.name
    ORDER BY turn_count DESC
";
$stmt = $pdo->query($sql);
$ranking = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 输出排行榜
echo "=== 转身过人排行榜 ===\n";
$rank = 1;
foreach ($ranking as $row) {
    echo "第{$rank}名:{$row['name']} —— {$row['turn_count']} 次\n";
    $rank++;
}
// 谁最多?
if (!empty($ranking)) {
    echo "\n🏆 转身过人王:{$ranking[0]['name']}({$ranking[0]['turn_count']} 次)\n";
}

输出示例:

=== 转身过人排行榜 ===
第1名:张三 —— 3 次
第2名:李四 —— 2 次
第3名:王五 —— 1 次
🏆 转身过人王:张三(3 次)

方式 2:PHP 数组统计(适合数据来自 API / 缓存)

<?php
// 假设从某处拿到原始记录
$records = [
    ['player' => '张三', 'action' => '转身过人'],
    ['player' => '张三', 'action' => '转身过人'],
    ['player' => '李四', 'action' => '转身过人'],
    ['player' => '张三', 'action' => '转身过人'],
    ['player' => '李四', 'action' => '转身过人'],
    ['player' => '王五', 'action' => '转身过人'],
    ['player' => '张三', 'action' => '传球'],
];
$counter = [];
foreach ($records as $r) {
    if ($r['action'] === '转身过人') {
        $counter[$r['player']] = ($counter[$r['player']] ?? 0) + 1;
    }
}
arsort($counter); // 按次数降序
print_r($counter);
// 输出:Array ( [张三] => 3 [李四] => 2 [王五] => 1 )

扩展建议

需求 实现方式
按比赛统计 WHERE match_id = ?
按时间段 WHERE created_at BETWEEN ? AND ?
成功率(转身过人后是否得分) 增加 result 字段,统计 result='成功'
缓存排行 用 Redis ZINCRBY ranking:turn 1 张三
分页排行榜 SQL 加 LIMIT ?, ?

如果用于 Web 展示(简易版)

// api.php
header('Content-Type: application/json; charset=utf-8');
$stmt = $pdo->query($sql);
echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC), JSON_UNESCAPED_UNICODE);

前端 fetch 后渲染表格即可。


请问你的具体场景是:

  1. 数据来源是 MySQL 还是文件/API?
  2. 要不要区分比赛、赛季?
  3. 要不要显示“转身过人成功率”?

告诉我,我可以给你更贴合的完整代码 👌

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