PHP实现从API多维数组获取含并列的前十射手榜单求助
解决射手前十榜单(含并列)的问题
嘿,看起来你的代码逻辑有点走偏了,导致返回了一大堆多余的条目。咱们换个更靠谱的思路:先把球员按进球数排序,再筛选出包含并列的前十榜单,这样就准确多了!
修正后的完整代码
function topTenGoalGetter() { // 获取API数据,顺便加个失败处理 $json_file = @file_get_contents('https://www.openligadb.de/api/getgoalgetters/bl1/2018'); if (!$json_file) { return []; // 如果API请求失败,返回空数组避免报错 } $entries = json_decode($json_file, true); if (empty($entries)) { return []; } // 第一步:按进球数降序排序,进球数相同的话按姓名升序(可选,让结果更整齐) usort($entries, function($a, $b) { if ($a['GoalCount'] !== $b['GoalCount']) { return $b['GoalCount'] - $a['GoalCount']; // 进球数从高到低排 } // 进球数一样时,按姓名拼音升序排,避免结果混乱 return strcmp($a['Name'], $b['Name']); }); // 第二步:确定前十榜单的最低进球数(处理并列情况) $top10_min_goal = null; $total_players = count($entries); if ($total_players >= 10) { $top10_min_goal = $entries[9]['GoalCount']; // 取排序后第10个球员的进球数(索引从0开始) } else { // 如果总球员数不足10,直接返回所有球员 return $entries; } // 第三步:筛选所有符合门槛的球员 $return_topten = []; foreach ($entries as $entry) { if ($entry['GoalCount'] >= $top10_min_goal) { $return_topten[] = $entry; } else { // 因为已经按降序排了,后面的进球数只会更小,直接跳出循环省时间 break; } } return $return_topten; }
对应的HTML部分可以稍微调整下显示文本:
<div class="bl-torschuetzen"> <div class="bl-torschuetzen-entries"> <span>德甲2018赛季射手前十榜单(含并列)</span> <pre> <?php var_dump(topTenGoalGetter());?> </pre> </div> </div>
为啥原代码会出问题?
你的原逻辑是收集所有进球数,然后循环删掉最小的直到剩下10个数值,但这些数值可能重复很多次——比如如果第十名的进球数有10个球员,那这10个都会被加进来,再加上前面的球员,总条数就会远超10条。
新逻辑就不一样了:
- 先把所有球员按进球数从高到低排好序,确保顺序正确;
- 找到排序后第10个球员的进球数,这就是咱们的“准入门槛”;
- 把所有进球数大于等于这个门槛的球员都保留,遇到更低的直接停手(因为已经排好序了,后面的肯定更小)。
这样既保证了包含所有并列第十的球员,又不会多取无关的条目。
内容的提问来源于stack exchange,提问作者user3073688
相关产品推荐
相关产品推荐

