php项目统计球员评分最高者是谁?

wen PHP项目 3

本文目录导读:

php项目统计球员评分最高者是谁?

  1. 基础场景:从数组数组中统计
  2. 处理重复最高分的情况
  3. 完整的面向对象版本
  4. 数据库SQL查询方式(最简洁)
  5. 性能优化建议

在PHP项目中统计球员评分最高者,我给你一个完整的实现方案,包含几种常见的场景。

基础场景:从数组数组中统计

假设数据来源于数据库查询结果的数组:

<?php
// 假设这是从数据库查询出的球员评分数据
$players = [
    ['name' => '梅西', 'rating' => 9.2],
    ['name' => 'C罗', 'rating' => 8.7],
    ['name' => '姆巴佩', 'rating' => 9.0],
    ['name' => '哈兰德', 'rating' => 8.9],
    ['name' => '内马尔', 'rating' => 8.5],
];
// 方案1:循环查找最大值
$maxRating = 0;
$bestPlayer = null;
foreach ($players as $player) {
    if ($player['rating'] > $maxRating) {
        $maxRating = $player['rating'];
        $bestPlayer = $player;
    }
}
echo "最高分球员: " . $bestPlayer['name'] . ",评分: " . $bestPlayer['rating'];
// 方案2:使用array_column和array_search
$ratings = array_column($players, 'rating');
$maxRating = max($ratings);
$index = array_search($maxRating, $ratings);
$bestPlayer = $players[$index];
echo "最高分球员: " . $bestPlayer['name'] . ",评分: " . $bestPlayer['rating'];
// 方案3:使用usort排序(适合需要多个最高分的情况)
usort($players, function($a, $b) {
    return $b['rating'] <=> $a['rating'];
});
$bestPlayer = $players[0];
echo "最高分球员: " . $bestPlayer['name'] . ",评分: " . $bestPlayer['rating'];
?>

处理重复最高分的情况

<?php
$players = [
    ['name' => '梅西', 'rating' => 9.2],
    ['name' => 'C罗', 'rating' => 9.2], // 同分
    ['name' => '姆巴佩', 'rating' => 9.0],
    ['name' => '哈兰德', 'rating' => 8.9],
    ['name' => '内马尔', 'rating' => 8.5],
];
// 找出所有最高分的球员
$maxRating = max(array_column($players, 'rating'));
$topPlayers = array_filter($players, function($player) use ($maxRating) {
    return $player['rating'] == $maxRating;
});
echo "最高分球员(可能多个):\n";
foreach ($topPlayers as $player) {
    echo $player['name'] . " - " . $player['rating'] . "\n";
}
?>

完整的面向对象版本

<?php
class PlayerStats {
    private $players = [];
    private $db;
    public function __construct($db) {
        $this->db = $db;
    }
    // 从数据库加载球员数据
    public function loadPlayers($season = null) {
        $sql = "SELECT player_name, AVG(rating) as avg_rating 
                FROM player_ratings 
                WHERE 1=1";
        if ($season) {
            $sql .= " AND season = ?";
        }
        $sql .= " GROUP BY player_name 
                  ORDER BY avg_rating DESC";
        $stmt = $this->db->prepare($sql);
        if ($season) {
            $stmt->bind_param('s', $season);
        }
        $stmt->execute();
        $result = $stmt->get_result();
        while ($row = $result->fetch_assoc()) {
            $this->players[] = [
                'name' => $row['player_name'],
                'rating' => round($row['avg_rating'], 2)
            ];
        }
    }
    // 获取最高分球员(可能多个)
    public function getTopRatedPlayers() {
        if (empty($this->players)) return [];
        $maxRating = max(array_column($this->players, 'rating'));
        return array_filter($this->players, function($player) use ($maxRating) {
            return $player['rating'] == $maxRating;
        });
    }
    // 获取单个最高分球员(如果多个,取第一个)
    public function getTopRatedPlayer() {
        $topPlayers = $this->getTopRatedPlayers();
        return !empty($topPlayers) ? reset($topPlayers) : null;
    }
    // 获取前N名球员
    public function getTopPlayers($count = 10) {
        $sorted = $this->players;
        usort($sorted, function($a, $b) {
            return $b['rating'] <=> $a['rating'];
        });
        return array_slice($sorted, 0, $count);
    }
}
// 使用示例
$db = new mysqli('localhost', 'username', 'password', 'dbname');
$stats = new PlayerStats($db);
// 加载2023赛季数据
$stats->loadPlayers('2023-2024');
// 获取最高分球员
$topPlayer = $stats->getTopRatedPlayer();
if ($topPlayer) {
    echo "2023赛季最高分球员: " . $topPlayer['name'] . " (评分: " . $topPlayer['rating'] . ")";
}
// 获取前10名
foreach ($stats->getTopPlayers(10) as $index => $player) {
    echo ($index + 1) . ". " . $player['name'] . " - " . $player['rating'] . "\n";
}
?>

数据库SQL查询方式(最简洁)

-- 直接通过SQL查询
SELECT player_name, AVG(rating) as avg_rating
FROM player_ratings
WHERE season = '2023-2024'
GROUP BY player_name
ORDER BY avg_rating DESC
LIMIT 1;
-- 如果有多个并列第一
SELECT player_name, AVG(rating) as avg_rating
FROM player_ratings
WHERE season = '2023-2024'
GROUP BY player_name
HAVING AVG(rating) = (
    SELECT MAX(avg_rating) 
    FROM (
        SELECT AVG(rating) as avg_rating
        FROM player_ratings
        WHERE season = '2023-2024'
        GROUP BY player_name
    ) as tmp
);

性能优化建议

// 使用缓存避免重复计算
function getBestPlayerCache($season) {
    $cacheKey = "best_player_" . $season;
    $cachedResult = apcu_fetch($cacheKey);
    if ($cachedResult === false) {
        // 没有缓存,进行计算
        $result = calculateBestPlayer($season);
        // 缓存1小时
        apcu_store($cacheKey, $result, 3600);
        return $result;
    }
    return $cachedResult;
}

选择哪个方案取决于你的具体需求:

  • 简单场景用数组循环SQL LIMIT 1
  • 需要多个最高分用array_filter
  • 复杂统计用完整的类设计
  • 性能敏感用SQL聚合 + 缓存

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