1

次の配列があります。

$learners=array('Eliza'=87,  'Joe'=81, 'Anne'=69, 'Marley'=39, 'Teddy'=39, 'Jemma'=90, 'Sylvia'=87);

これまでのところ、次のように 2 つの配列を分離することができました。

$tudents=array_keys($learners);
$scores=array_values($learners);

ランキングは以下の通りです。

Student    Score    Position
Jemma       90          1
Sylvia      87          2
Eliza       87          2
Joe         81          4
Anne        69          5
Marley      39          7
Teddy       69          7

名前をキーとして、位置を値として持つ新しい配列を作成したいと思います。

$positions=array('Jemma'=1, 'Sylvia'=2, 'Eliza'=2, 'Joe'=4, 'Anne'=5, 'Marley'=7, 'Teddy'=7);

これにより、スクリプトの任意の時点で任意の名前と位置をエコーできます。どうすればよいかわかりません。

スコアに重複がある場合、ランキングは単純ではありません。2 位が同点の場合は 3 位をスキップする。スコアの最後に同点が発生した場合、両方のスコアが最後の位置に配置され、前の位置がスキップされます。上記の例では、位置 6 がスキップされ、2 つの 39 が位置 7 を占めています。

どんな助けでも大歓迎です

4

3 に答える 3

1

別の解決策は次のとおりです。

最初に値で並べ替えます (print_r は進行状況を確認するためのものです)。

arsort($learners);
print_r($learners);

次に、ランキングの配列を作成しますが、スコアが前の要素のスコアと同じ場合はランクを上げません。

$rank = $pos = 1;
$prev_score = current($learners);
foreach ($learners as $name => $score) {
    if ($score != $prev_score) {
        $rank = $pos;
    }
    $ranking[$name] = $rank;
    $prev_score = $score;
    $pos++;
}
print_r($ranking);

最後のエントリを修正すると、最後の要素と同じスコアを持つ要素はすべて 7 位になります。特定の値を検索する array_keys() にはめったに使用されない引数があります。

$low_score = end($learners);
$last_place = count($learners);
foreach (array_keys($learners, $low_score) as $name) {
    $ranking[$name] = $last_place;
}
print_r($ranking);

出力:

Array
(
    [Jemma] => 90
    [Sylvia] => 87
    [Eliza] => 87
    [Joe] => 81
    [Anne] => 69
    [Marley] => 39
    [Teddy] => 39
)
Array
(
    [Jemma] => 1
    [Sylvia] => 2
    [Eliza] => 2
    [Joe] => 4
    [Anne] => 5
    [Marley] => 6
    [Teddy] => 6
)
Array
(
    [Jemma] => 1
    [Sylvia] => 2
    [Eliza] => 2
    [Joe] => 4
    [Anne] => 5
    [Marley] => 7
    [Teddy] => 7
)
于 2013-11-01T23:30:15.040 に答える