0

これは、 PHP で MySQL の結果を繰り返しながら、将来の重複値を検出する のフォローアップです。

結果を生成する SQL クエリがあります。

team_id   division_id   wins
-------------------------------
10        2             44
9         2             42
5         1             42
2         1             42
3         1             41
11        2             40
1         1             36
8         2             31
7         2             29
12        2             24
4         1             20
6         1             18

特定のチームの総合ランキングと部門ランキングを計算しようとしています。

たとえば、team_id = 1 :

Overall:       7
Divisional:    4

team_id = 3の場合:

Overall:       5
Divisional:    3

team_id = 9の場合:

Overall:     T-2  //must indicate tie
Divisional:    2

リンクされた前の質問/回答からわかるように、全体のランクをうまく計算できます。この問題は、ディビジョン ランクの計算にも関連しています (タイの適切な処理を含む)。

結果を次のような多次元配列に格納しようとしました$arr['wins']['division_id']['team_id']...

44 =>  2 => 10
42 =>  1 =>  5
             2
       2 =>  9
41 =>  1 =>  3
40 => 11 =>  2
...

しかし、反復して2つのそれぞれのランクを取得する方法、およびそれぞれの同点を適切に検出する方法については固執しています。

4

1 に答える 1

0

次のようなことを試してください:

// Dataset as defined on question
$arr = array(
array('team_id' => 10, 'division_id' => 2, 'wins' => 44),
array('team_id' => 9, 'division_id' => 2, 'wins' => 42),
array('team_id' => 5, 'division_id' => 1, 'wins' => 42),
array('team_id' => 2, 'division_id' => 1, 'wins' => 42),
array('team_id' => 3, 'division_id' => 1, 'wins' => 41),
array('team_id' => 11, 'division_id' => 2, 'wins' => 40),
array('team_id' => 1, 'division_id' => 1, 'wins' => 36),
array('team_id' => 8, 'division_id' => 2, 'wins' => 31),
array('team_id' => 7, 'division_id' => 2, 'wins' => 29),
array('team_id' => 12, 'division_id' => 2, 'wins' => 24),
array('team_id' => 4, 'division_id' => 1, 'wins' => 20),
array('team_id' => 6, 'division_id' => 1, 'wins' => 18));


$divisionTeam = array();
$divisionWins = array();
foreach($arr as $team) {
    $divisionTeam[$team['division_id']][] = $team['team_id'];
    $divisionWins[$team['division_id']][] = $team['wins'];
}



echo "<pre>";
foreach (array_keys($divisionTeam) as $division_id) {
    $rank = 0;
    $prevWins = -1;
    echo "DIVISION $division_id \n";
    foreach ($divisionTeam[$division_id] as $index => $team_id) {

       if ($prevWins == $divisionWins[$division_id][$index]) {
           echo $team_id . " T - " . $rank . "\n";
       }
       else { 
           $rank++;
           echo $team_id . " " . $rank . "\n";
       }
       $prevWins = $divisionWins[$division_id][$index];

    }
}
echo "</pre>";
于 2012-06-15T22:42:33.740 に答える