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

PHP中用foreach按league id分组赛事并排除无赛事联赛

问题:按联赛ID分组赛事并排除无对应赛事的联赛

我有两个JSON文件,一个包含联赛ID、联赛名称等联赛数据,另一个包含赛事ID和对应联赛ID的赛事数据。需求是通过foreach循环遍历赛事,按联赛ID分组,同时排除没有对应赛事的联赛(比如League 202)。

尝试的代码

foreach($league_group as $league) { 
    echo "League ID"; 
    foreach($fixture_list as $fixture){
        if($league->id == $fixture->league->id){
            echo $fixture->id."<br />";
        } else {
            echo "";
        }
    } 
} 

联赛文件内容(修正后合法JSON)

{
  "response": [
    {
      "league": {
        "id": 199,
        "name": "league 199",
        "type": "xxx",
        "logo": "xxxx"
      }
    },
    {
      "league": {
        "id": 200,
        "name": "league 200",
        "type": "xxx",
        "logo": "xxxx"
      }
    },
    {
      "league": {
        "id": 201,
        "name": "league 201",
        "type": "xxx",
        "logo": "xxxx"
      }
    },
    {
      "league": {
        "id": 202,
        "name": "league 202",
        "type": "xxx",
        "logo": "xxxx"
      }
    }
  ]
}

赛事文件内容(修正后合法JSON)

{
  "response": [
    {
      "fixture": {
        "id": 985816,
        "date": "2023-04-27T00:00:00+00:00"
      },
      "venue": {
        "id": 2356
      },
      "league": {
        "id": 199,
        "name": "league 199"
      }
    },
    {
      "fixture": {
        "id": 980016,
        "date": "2023-04-27T00:00:00+00:00"
      },
      "venue": {
        "id": 2354
      },
      "league": {
        "id": 199,
        "name": "league 199"
      }
    },
    {
      "fixture": {
        "id": 966816,
        "date": "2023-04-27T00:00:00+00:00"
      },
      "venue": {
        "id": 1145
      },
      "league": {
        "id": 200,
        "name": "league 200"
      }
    },
    {
      "fixture": {
        "id": 911116,
        "date": "2023-04-27T00:00:00+00:00"
      },
      "venue": {
        "id": 7380
      },
      "league": {
        "id": 200,
        "name": "league 200"
      }
    },
    {
      "fixture": {
        "id": 910006,
        "date": "2023-04-27T00:00:00+00:00"
      },
      "venue": {
        "id": 7380
      },
      "league": {
        "id": 201,
        "name": "league 201"
      }
    }
  ]
}

期望输出

league-id: 199
 - fixture-id: 985816
 - fixture-id: 980016
league-id: 200
 - fixture-id: 966816
 - fixture-id: 911116
league-id: 201
 - fixture id: 910006
*xxx exclude League 202 because it has no fixture xxxx*

解决方案

优化思路:先将赛事按联赛ID预分组,避免嵌套循环的低效,再遍历联赛输出结果并记录无赛事的联赛。

// 假设已解析JSON文件为对象数组
// $leagues = json_decode(file_get_contents('leagues.json'))->response;
// $fixtures = json_decode(file_get_contents('fixtures.json'))->response;

// 1. 将赛事按联赛ID分组
$fixtureGroups = [];
foreach ($fixtures as $fixture) {
    $leagueId = $fixture->league->id;
    if (!isset($fixtureGroups[$leagueId])) {
        $fixtureGroups[$leagueId] = [];
    }
    $fixtureGroups[$leagueId][] = $fixture->fixture->id;
}

// 2. 遍历联赛输出结果,记录无赛事的联赛
$excludedLeagues = [];
foreach ($leagues as $item) {
    $league = $item->league;
    if (isset($fixtureGroups[$league->id])) {
        echo "league-id: {$league->id}\n";
        foreach ($fixtureGroups[$league->id] as $fixtureId) {
            echo " - fixture-id: {$fixtureId}\n";
        }
    } else {
        $excludedLeagues[] = $league->name;
    }
}

// 3. 输出排除提示
if (!empty($excludedLeagues)) {
    foreach ($excludedLeagues as $leagueName) {
        echo "*xxx exclude {$leagueName} because it has no fixture xxxx*\n";
    }
}

代码说明

  • 预分组赛事:通过一次遍历将赛事按联赛ID归类,后续直接通过ID访问对应赛事,提升效率。
  • 筛选输出联赛:仅输出存在对应赛事的联赛,同时收集无赛事的联赛名称。
  • 统一输出排除提示:最后集中显示所有被排除的联赛信息,符合需求格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:13:12