PHP项目统计角球数哪边领先
在足球赛事项目中,统计角球数并判断哪边领先是常见需求,下面给你一个完整的实现思路和代码示例。

核心逻辑
判断角球领先只需要比较主队和客队的角球数:
- 主队角球 > 客队角球 → 主队领先
- 主队角球 < 客队角球 → 客队领先
- 相等 → 平局
基础实现
<?php
class CornerStats
{
/**
* 获取角球领先方
*
* @param int $homeCorners 主队角球数
* @param int $awayCorners 客队角球数
* @return array
*/
public function getLeading(int $homeCorners, int $awayCorners): array
{
if ($homeCorners > $awayCorners) {
return [
'leader' => 'home',
'diff' => $homeCorners - $awayCorners,
'text' => '主队领先',
];
}
if ($homeCorners < $awayCorners) {
return [
'leader' => 'away',
'diff' => $awayCorners - $homeCorners,
'text' => '客队领先',
];
}
return [
'leader' => 'draw',
'diff' => 0,
'text' => '角球平局',
];
}
}
// 使用
$corner = new CornerStats();
$result = $corner->getLeading(5, 3);
print_r($result);
// 输出:
// Array ( [leader] => home [diff] => 2 [text] => 主队领先 )
带数据库的真实场景
假设表结构:
CREATE TABLE matches (
id INT PRIMARY KEY AUTO_INCREMENT,
home_team VARCHAR(50),
away_team VARCHAR(50),
home_corners INT DEFAULT 0,
away_corners INT DEFAULT 0,
status TINYINT DEFAULT 0 -- 0未开始 1进行中 2结束
);
PHP 查询并判断:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=football', 'root', '123456');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$matchId = 1001;
$stmt = $pdo->prepare("SELECT home_team, away_team, home_corners, away_corners FROM matches WHERE id = ?");
$stmt->execute([$matchId]);
$match = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$match) {
exit('比赛不存在');
}
$home = (int)$match['home_corners'];
$away = (int)$match['away_corners'];
if ($home > $away) {
$leaderText = "{$match['home_team']} 角球领先 " . ($home - $away) . " 个";
} elseif ($home < $away) {
$leaderText = "{$match['away_team']} 角球领先 " . ($away - $home) . " 个";
} else {
$leaderText = "双方角球数相同({$home} - {$away})";
}
echo $leaderText;
进阶:实时变化 + 领先标记
如果要做实时角球走势(哪一方在角球上一直压制),可以记录角球产生的时间点:
<?php
class CornerTrend
{
/**
* @param array $corners 角球记录 [['minute'=>10,'team'=>'home'], ...]
* @return array 走势结果
*/
public function analyze(array $corners): array
{
$home = 0;
$away = 0;
$leadChanges = 0;
$lastLeader = 'draw';
$maxLead = ['team' => null, 'diff' => 0];
foreach ($corners as $c) {
if ($c['team'] === 'home') {
$home++;
} else {
$away++;
}
// 当前领先方
if ($home > $away) {
$current = 'home';
$diff = $home - $away;
} elseif ($home < $away) {
$current = 'away';
$diff = $away - $home;
} else {
$current = 'draw';
$diff = 0;
}
// 统计领先方变化次数
if ($current !== 'draw' && $current !== $lastLeader && $lastLeader !== 'draw') {
$leadChanges++;
}
if ($current !== 'draw') {
$lastLeader = $current;
}
// 记录最大领先
if ($diff > $maxLead['diff']) {
$maxLead = ['team' => $current, 'diff' => $diff];
}
}
// 最终领先
if ($home > $away) {
$final = 'home';
} elseif ($home < $away) {
$final = 'away';
} else {
$final = 'draw';
}
return [
'home' => $home,
'away' => $away,
'final' => $final,
'lead_changes'=> $leadChanges,
'max_lead' => $maxLead,
];
}
}
// 使用
$trend = new CornerTrend();
$res = $trend->analyze([
['minute' => 5, 'team' => 'home'],
['minute' => 18, 'team' => 'home'],
['minute' => 30, 'team' => 'away'],
['minute' => 45, 'team' => 'away'],
['minute' => 52, 'team' => 'home'],
]);
print_r($res);
前端展示建议
可以返回 JSON 给前端:
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'home_corners' => $home,
'away_corners' => $away,
'leader' => $leader ?? 'draw', // home / away / draw
'leader_text' => $leaderText,
'diff' => abs($home - $away),
], JSON_UNESCAPED_UNICODE);
前端根据 leader 字段给领先方加高亮样式即可。
| 需求 | 做法 |
|---|---|
| 判断谁领先 | 直接比较两个角球数 |
| 领先幅度 | abs($home - $away) |
| 实时压制 | 记录每次角球 + 时间轴分析 |
| 数据来源 | 从 matches 表或第三方 API 获取 |
| 前端友好 | 返回 leader 字段 + 文本 |
如果你能告诉我你的数据来源(数据库表结构 / 第三方接口格式)和要展示在哪里(网页列表 / 实时大屏 / 小程序),我可以给你更贴合的代码。