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

PHP按轮次分组生成锦标赛对阵表JSON多维数组实现方法

PHP构造按轮次分组的锦标赛对阵表JSON

问题修正点

原有代码存在两个问题:

  • 未基于查询结果的round字段做轮次层级拆分,所有对阵行被平铺到同一层级,不符合嵌套结构要求
  • 第二个对阵对象的id、name属性赋值写反,会直接导致输出数据错误

实现代码(单次遍历完成分组)

遍历过程中自动按轮次初始化分组,将对阵行追加到对应轮次下即可,全程仅需一次循环,时间复杂度O(n):

$bracket = [];
foreach ($data as $dt) {
    // 获取当前对阵所属轮次,转整数避免字符串键导致JSON编码为对象
    $round = (int)$dt['round'];
    // 若当前轮次的分组不存在,先初始化为空数组
    if (!isset($bracket[$round - 1])) {
        $bracket[$round - 1] = [];
    }
    // 追加当前对阵行到对应轮次下,修正原代码id/name赋值反了的问题
    $bracket[$round - 1][] = [
        [
            'name' => $dt['player_name'],
            'id'   => (int)$dt['player_id']
        ],
        [
            'name' => $dt['participant_name'],
            'id'   => (int)$dt['participant_id']
        ]
    ];
}

// 如果轮次值可能不连续,可打开下方注释重新索引外层数组,保证输出为标准JSON数组
// $bracket = array_values($bracket);

// 输出最终JSON,JSON_UNESCAPED_UNICODE用于兼容中文名称,按需添加
$jsonResult = json_encode($bracket, JSON_UNESCAPED_UNICODE);

输出结构说明

针对给出的3条测试数据,最终生成的JSON完全符合三层嵌套结构要求:

  1. 最外层为轮次数组,顺序对应比赛轮次
  2. 每个轮次节点下为对阵行数组,每个元素对应一组对阵
  3. 每个对阵行存储2个参赛对象,包含name、id两个属性

对应示例输出:

[
    // 第一轮(Round 1)
    [
        // 第一轮第一组对阵
        [
            {"name": "Mark Alan", "id": 1},
            {"name": "Steve", "id": 3}
        ],
        // 第一轮第二组对阵
        [
            {"name": "John Doe", "id": 2},
            {"name": "Sean Henshaw", "id": 4}
        ]
    ],
    // 第二轮(Round 2)
    [
        // 第二轮第一组对阵
        [
            {"name": "Mark Alan", "id": 1},
            {"name": "John Doe", "id": 2}
        ]
    ]
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:03:55