PHP:按积分、胜场等多字段对联赛球队数组排序
联赛积分表多维度排序实现方法
需要对球队数组按积分(points)降序→胜场(wins)降序→平局(draws)降序→负场(loss)升序的优先级排序(负场越少排名越高),以下是两种可行的实现方案:
原始球队数组
$teams = [ '35006454-f94e-4d2e-90a4-3e09cbae7885' => [ 'teamid' => '35006454-f94e-4d2e-90a4-3e09cbae7885', 'teamtitle' => 'Team0', 'avatar' => 'Link.jpg', 'points' => 8, 'wins' => 4, 'loss' => 0, 'draws' => 0, 'matches' => 4 ], '807bafad-fb44-4062-bc87-d6c7566c943d' => [ 'teamid' => '807bafad-fb44-4062-bc87-d6c7566c943d', 'teamtitle' => 'Team1', 'avatar' => 'Link.jpg', 'points' => 6, 'wins' => 3, 'loss' => 1, 'draws' => 0, 'matches' => 4 ] ];
方法一:使用uasort()自定义排序逻辑(保留原键名)
通过自定义比较函数,按优先级依次对比字段值,返回排序差值:
uasort($teams, function($a, $b) { // 1. 优先按积分降序 if ($a['points'] !== $b['points']) { return $b['points'] - $a['points']; } // 2. 积分相同按胜场降序 if ($a['wins'] !== $b['wins']) { return $b['wins'] - $a['wins']; } // 3. 胜场相同按平局降序 if ($a['draws'] !== $b['draws']) { return $b['draws'] - $a['draws']; } // 4. 平局相同按负场升序(负场少的排前) return $a['loss'] - $b['loss']; });
如果不需要保留原UUID键名,改用usort()即可,用法完全一致。
方法二:使用array_multisort()实现多字段排序
先提取各排序字段的独立数组,再按优先级传入函数完成同步排序:
// 提取各排序字段的对应数组 $points = []; $wins = []; $draws = []; $loss = []; foreach ($teams as $team) { $points[] = $team['points']; $wins[] = $team['wins']; $draws[] = $team['draws']; $loss[] = $team['loss']; } // 执行多维度排序:积分降序→胜场降序→平局降序→负场升序 array_multisort( $points, SORT_DESC, $wins, SORT_DESC, $draws, SORT_DESC, $loss, SORT_ASC, $teams // 要排序的原始球队数组 );
此方法默认保留原数组的关联键名,排序逻辑清晰,适合字段较多的场景。
内容的提问来源于stack exchange,提问作者Alez
相关产品推荐
相关产品推荐

