本文目录导读:

在PHP项目中统计“转身过人次数”,首先需要明确数据来源和业务场景,通常有以下几种情况,我分别给出解决方案:
从数据库(如MySQL)中统计
适合有专门的数据表记录球员每场比赛的技术统计。
假设表结构:
-- 球员表 players: id, name -- 比赛技术统计表 match_stats: id, player_id, match_id, turns (转身过人次数)
统计总次数最多的球员(Top N):
<?php
$pdo = new PDO('mysql:host=localhost;dbname=football', 'root', '');
// 统计所有球员总转身次数,降序排列前10
$sql = "SELECT p.name, SUM(ms.turns) AS total_turns
FROM players p
INNER JOIN match_stats ms ON p.id = ms.player_id
GROUP BY p.id, p.name
ORDER BY total_turns DESC
LIMIT 10";
$stmt = $pdo->query($sql);
$players = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 最高者
$topPlayer = $players[0] ?? null;
echo "最强者: " . $topPlayer['name'] . ",次数: " . $topPlayer['total_turns'];
?>
按赛季或日期区间统计:
// 加入条件筛选,比如统计2024赛季
$startDate = '2024-01-01';
$endDate = '2024-12-31';
$sql = "SELECT p.name, SUM(ms.turns) AS total_turns
FROM match_stats ms
JOIN players p ON p.id = ms.player_id
JOIN matches m ON ms.match_id = m.id
WHERE m.match_date BETWEEN :start AND :end
GROUP BY p.id
ORDER BY total_turns DESC
LIMIT 10";
数据在JSON或数组中(内存中处理)
如果是临时数据或从API拉取的JSON,用PHP数组函数统计。
<?php
// 假设数据格式:多场比赛,每场有多个球员
$data = [
['player' => '张三', 'turns' => 5],
['player' => '李四', 'turns' => 8],
['player' => '张三', 'turns' => 10],
['player' => '王五', 'turns' => 3],
];
// 使用 array_reduce 聚合统计
$stats = [];
foreach ($data as $item) {
$name = $item['player'];
if (!isset($stats[$name])) {
$stats[$name] = 0;
}
$stats[$name] += $item['turns'];
}
// 排序
arsort($stats); // 保持键名降序
$topPlayerName = array_key_first($stats); // PHP 7.3+ 支持
$maxTurns = $stats[$topPlayerName];
echo "转身最多的是:{$topPlayerName},共 {$maxTurns} 次";
// 或者输出完整排名
print_r($stats);
?>
从文本日志/事件流中解析
转身过人”是比赛中的事件流(如每秒记录一次),需要解析日志。
// 事件格式: "2024-05-01 10:30:15 张三 转身"
$log = file('events.log');
$counter = [];
foreach ($log as $line) {
if (strpos($line, '转身') !== false) {
preg_match('/\s(\S+)\s转身/', $line, $m);
if (isset($m[1])) {
$counter[$m[1]] = ($counter[$m[1]] ?? 0) + 1;
}
}
}
arsort($counter);
// 输出...
实时统计(如Redis计数器)
如果系统并发高,使用Redis的Hash或Sorted Set记录实时数据,PHP通过Redis读取。
// 写入(每次转身)
$redis->hincrby('player_turns', '张三', 1);
// 读取排行榜(按次数排序)
$scores = $redis->zrevrange('player_turns_sorted', 0, 9, 'WITHSCORES');
// ZADD 写法:$redis->zincrby('player_turns_sorted', 1, '张三');
最核心的答案(如果你只需要一段通用代码)
假设你有一个数组或查询结果,以下是最通用的“找出最大”函数:
<?php
/**
* 从多维数组/集合中统计并返回最大者
* @param array $items 每项包含 player 和 turns 键,或对象
*/
function findTopTurner(array $items): array
{
$turnsMap = [];
foreach ($items as $item) {
$name = $item['player'] ?? $item->player;
$turns = $item['turns'] ?? $item->turns;
if (!isset($turnsMap[$name])) {
$turnsMap[$name] = 0;
}
$turnsMap[$name] += $turns;
}
arsort($turnsMap);
$topName = array_key_first($turnsMap);
return ['player' => $topName, 'turns' => $turnsMap[$topName]];
}
// 调用
$result = findTopTurner($yourData);
echo "最多者: {$result['player']} ({$result['turns']}次)";
请补充你的具体数据形式(是数据库?JSON?还是实时流?),我可以给出针对性更强的代码,如果只是比较两个具体球员的“谁多”,那就是简单的减法:
$playerA_turns = 10; $playerB_turns = 15; echo $playerA_turns > $playerB_turns ? "A多" : "B多";