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
相关产品推荐
相关产品推荐

