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完全符合三层嵌套结构要求:
- 最外层为轮次数组,顺序对应比赛轮次
- 每个轮次节点下为对阵行数组,每个元素对应一组对阵
- 每个对阵行存储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
相关产品推荐
相关产品推荐

