在PHP中使用分段符对3个或更多值进行排序
我使用PHP中的在PHP中使用分段符对3个或更多值进行排序,php,sorting,ranking,usort,Php,Sorting,Ranking,Usort,我使用PHP中的usort,根据一组打破平局的标准对一个列表进行排名。我的问题是,当有3个或更多的领带要断开时,打捆机没有正确应用。函数在遍历数组时仅在两个条目之间排序 当两个条目具有相同的总体wins时,功能检查部门wins;如果这些相同,它会检查头对头的;然后,如果领带仍未断开,则点。这对于打破两个条目之间的联系非常有效,但是对于3个或更多的联系,这个过程的迭代性质是一个问题 例如: 3个参赛项目具有相同的总赢款和分部赢款,因此我们检查头对头结果 第一队击败了第二队 第二队击败了第三队 第
usort
,根据一组打破平局的标准对一个列表进行排名。我的问题是,当有3个或更多的领带要断开时,打捆机没有正确应用。函数在遍历数组时仅在两个条目之间排序
当两个条目具有相同的总体wins
时,功能检查部门wins
;如果这些相同,它会检查头对头的;然后,如果领带仍未断开,则点
。这对于打破两个条目之间的联系非常有效,但是对于3个或更多的联系,这个过程的迭代性质是一个问题
例如:
3个参赛项目具有相同的总赢款
和分部赢款
,因此我们检查头对头
结果
- 第一队击败了第二队
- 第二队击败了第三队
- 第三队击败了第一队
因此,我们应该继续看积分
,因为头对头
不可能打破平局,因为每支球队都会赢下另外两支球队。但我的函数从来没有进行过第三次检查,我想是因为当usort()
执行这项任务时,团队A和团队C并不相邻……我不确定
下面是我传递给usort
的比较函数:
function set_division_order($a, $b) {
if ($a['wins'] == $b['wins'] && $a['losses'] == $b['losses']) { //same overall record
if ($a['div_wins'] == $b['div_wins'] && $a['div_losses'] == $b['div_losses']) { //same division record
$h2h = get_h2h_result($year, $a['team_id'], $b['team_id']);
if ($h2h == 0) { //same head-to-head record
return ($b['pts'] - $a['pts']);
}
else { //head-to-head winner
return $h2h;
}
}
else { //different division record
return ($b['div_wins'] - $a['div_wins']);
}
}
else { //different overall record
return ($b['wins'] - $a['wins']);
}
}
数组被传递到usort($array,'set\u division\u order')
中,这会导致以下问题:
Array
(
[0] => Array
(
[team_id] => 1
[wins] => 3
[losses] => 2
[ties] => 0
[div_wins] => 3
[div_losses] => 2
[div_ties] => 0
[pts] => 513.9
)
[1] => Array
(
[team_id] => 2
[wins] => 3
[losses] => 2
[ties] => 0
[div_wins] => 3
[div_losses] => 2
[div_ties] => 0
[pts] => 504.1
)
[2] => Array
(
[team_id] => 3
[wins] => 3
[losses] => 2
[ties] => 0
[div_wins] => 3
[div_losses] => 2
[div_ties] => 0
[pts] => 517.7
)
[3] => Array
(
[team_id] => 4
[wins] => 4
[losses] => 1
[ties] => 0
[div_wins] => 4
[div_losses] => 1
[div_ties] => 0
[pts] => 491.9
)
[4] => Array
(
[team_id] => 5
[wins] => 2
[losses] => 3
[ties] => 0
[div_wins] => 2
[div_losses] => 3
[div_ties] => 0
[pts] => 393.3
)
[5] => Array
(
[team_id] => 6
[wins] => 0
[losses] => 5
[ties] => 0
[div_wins] => 0
[div_losses] => 5
[div_ties] => 0
[pts] => 377.9
)
)
抱歉,这有点长,但希望问题很明显。现在是解决问题的时候了!我在PHP资源中搜索了各种排序函数,但运气不好。我不是唯一一个试图打破与PHP三方关系的人。:)
如果我可以将符合该条件的绑定团队放入一个单独的数组中,我可以使用一个函数根据这个新子数组的值对原始排序数组重新排序,以便在主数组中对绑定团队进行排序
…我的头爆炸了
谢谢 首先,这永远不会起作用,
$mysqli->error
,还有一些原因。@Fred ii-我对SQL没有任何问题。您能提供一个示例输入数组,并用数组替换您的db查询,以便我们重现当前的行为吗?(换句话说,请提供MCVE)旁注:在比较函数中执行SQL查询似乎是一个非常糟糕的主意。排序之前,您应该检索所有需要的信息,因为比较函数通常会访问相同的值进行不同的比较。@praguian,A队、B队和C队很可能有相同的胜负,但A队赢了B队,B队赢了C队,C队赢了A队。您为什么要先排序?正如我所说,头对头比较是不可传递的。首先,这永远不会起作用,$mysqli->error
,还有一些原因。@Fred ii-我对SQL没有任何问题。你能提供一个示例输入数组并用数组替换你的db查询,这样我们就可以重现当前的行为吗?(换句话说,请提供MCVE)旁注:在比较函数中执行SQL查询似乎是一个非常糟糕的主意。排序之前,您应该检索所有需要的信息,因为比较函数通常会访问相同的值进行不同的比较。@praguian,A队、B队和C队很可能有相同的胜负,但A队赢了B队,B队赢了C队,C队赢了A队。您为什么要先排序?正如我所说,正面比较是不可传递的。