0

私はこの種のソートを達成するために常にこの方法を使用してきましたが、私には正しく見えません

usort($array, function($team1, $team2){

    $t1 = ($team1->points * 1000) + ($team1->goalsFor - $team1->goalsAgainst);
    $t2 = ($team2->points * 1000) + ($team2->goalsFor - $team2->goalsAgainst);

    if($t1 == $t2) return 0;
    return $t1 > $t2 ? 1 : -1;
});

この方法の代わりに、str_pad を使用することもできます。これはほぼ同じことを行います。


基本的に私がしていることは、ソート対象をゼロで区切ることです

$t1 = 32008; // 32 points with a GD of 8
$t2 = 32003; // 32 points with a GD of 3

しかし、チームが奇妙なゴール差をつけた場合はどうなるでしょうか?

$t1 = 32008; // 32 points with a GD of 8
$t2 = 33000; // 32 points with a GD of 1000

明らかにこれは起こり得ませんが、これは例です

これは良い方法ですか?32-64 ビット / 浮動小数点数の [im]precision 制限はどうですか?

誰かがこれについて提案がありますか?

ありがとうございました :)


タイトルを自由に改善してください

4

1 に答える 1

1

より良いアプローチはこれです:

function ($team1, $team2) {
    if ($team1->points != $team2->points) {
        return $team1->points > $team2->points ? 1 : -1;
    }
    $diff1 = $team1->goalsFor - $team1->goalsAgainst;
    $diff2 = $team2->goalsFor - $team2->goalsAgainst;
    if ($diff1 != $diff2) {
        return $diff1 > $diff2 ? 1 : -1;
    }
    return 0;
}

または、Java ( Guavaを使用) では、次のように記述します。

public int compare(Team team1, Team team2) {
    return ComparisonChain.start()
            .compare(team1.getPoints(), team2.getPoints)
            .compare(team1.getGoalsFor() - team1.getGoalsAgainst(),
                     team2.getGoalsFor() - team2.getGoalsAgainst())
            .result();
}

明らかに、PHP には がありませんがComparisonChain、実装は難しくありません。

于 2013-09-01T14:49:02.410 に答える