本文目录导读:

在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聚合 + 缓存