You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中实现无重复的球员两两配对?

实现FIFA18杯赛球员两两配对的解决方案

嘿,你已经搞定了场次计算的核心部分,现在只需要添上生成具体配对的逻辑就大功告成啦!咱们直接来解决这个问题:

核心思路:生成无重复的两两配对

要实现无重复、无自战的配对,最直接高效的方式是用嵌套循环:外层遍历每个球员,内层只遍历当前球员之后的所有球员——这样既不会出现A vs B和B vs A的重复配对,也绝对不会出现球员和自己对战的情况。

整合到你的现有代码中

我把配对逻辑加到了你的代码里,同时还优化了场次计算的部分(用更简洁的组合公式代替阶乘,避免大数溢出问题):

<?php 
require("server/baza.php"); 
$przelacznik = 1;//$_POST['losuj']; 
$zapytanie = "select nick from mecze"; 

if($przelacznik == 1){ 
    $wynik = mysqli_query($polaczenie,$zapytanie); 
    $tab = array(); 
    $n=0; 

    // 从数据库读取球员列表
    while($wiersz = mysqli_fetch_assoc($wynik)){ 
        array_push($tab,$wiersz['nick']); 
        $n++; 
    } 

    // 优化场次计算:用组合数简化公式代替阶乘,更高效安全
    $ilosc_rozgrywek = $n * ($n - 1) / 2; 

    // 生成所有无重复配对
    $pairings = array();
    for ($i = 0; $i < $n; $i++) {
        // 内层循环从i+1开始,彻底避免重复和自战
        for ($j = $i + 1; $j < $n; $j++) {
            // 用数组存储配对,方便后续灵活使用
            $pairings[] = array(
                'player1' => $tab[$i],
                'player2' => $tab[$j]
            );
            // 如果需要直接生成字符串格式,也可以这样写:
            // $pairings[] = $tab[$i] . " vs " . $tab[$j];
        }
    }

    // 示例:输出所有配对结果
    echo "总共需要进行 {$ilosc_rozgrywek} 场比赛:<br>";
    foreach ($pairings as $match) {
        echo "{$match['player1']} vs {$match['player2']}<br>";
    }
} 
?>

关键细节说明

  • 配对逻辑:外层循环$i控制第一个球员,内层循环$j从$i+1开始,确保每个配对只生成一次(比如P1 vs P2只会出现一次,不会反过来生成P2 vs P1)。
  • 场次计算优化:原来的阶乘计算在球员数量较多时容易出现数值溢出,而n*(n-1)/2是组合数C(n,2)的简化公式,结果完全一致但更高效安全。
  • 配对存储:用数组存储每个配对的两个球员,后续你可以更灵活地使用这些数据(比如存入数据库、生成可视化赛程表等),如果需要直接输出字符串格式,也可以改成注释里的写法。

内容的提问来源于stack exchange,提问作者shapir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:47:25