搜尋

首頁  >  問答  >  主體

演算法 - 用PHP如何達成分數排名,有什麼好的想法?

對學生成績做一個排名,分數為一個數組,排好名次後輸出排名結果:
比如$scores = array(90,100,100); 自訂函數實現返回數組 $rank(3,1,1);

世界只因有你世界只因有你2861 天前1244

全部回覆(5)我來回復

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-16 13:18:24

    $arr = [99,100,100];
    $arr1=$arr;
    rsort($arr1);
    $c=[];
     foreach ( $arr as $v){
         $b= array_search($v, $arr1);
         $c[]=$b+1;
     }
     print_r($c);
    

    ?>

    這個能滿足你的需求,但是我有一個問題, 兩個並列第一,考99那位不應該是第二名麼

    回覆
    0
  • ringa_lee

    ringa_lee2017-05-16 13:18:24

    題主想要的是按原數組順序顯示的排名(可並列)。大體思路是將原始數組補充上位置信息,然後按照排序的結果反向構建排名數組。寫出來比較囉嗦:

    get_ranks(a[1:n])
      s ← array(n)
      ranks ← array(n)
      for i from 1 to n                 ▷ s[i] has record type
        s[i] ← {position: i, value: a[i], rank: 0}
      descending_sort(s by value)       ▷ sort by s[i].value
      s[1].rank ← 1
      for i from 2 to n
        if s[i].value < s[i-1].value    ▷ dense rank
          s[i].rank ← s[i-1].rank + 1
        else
          s[i].rank ← s[i-1].rank
      for i from 1 to n                 ▷ construct result
        ranks[s[i].position] ← s[i].rank
      return ranks[]
      

    注意如果有多個並列第n,下一個將是第n+1名,這點與題主給出例子有點不同。整個演算法的複雜度瓶頸還是排序,即O(n lgn)。

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-16 13:18:24

    用php本身的陣列排序函數?

    回覆
    0
  • phpcn_u1582

    phpcn_u15822017-05-16 13:18:24

    http://www.php.net/manual/zh/...
    自帶的資料排序 應該可以解決你的問題

    回覆
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-16 13:18:24

    先依照分數為這個陣列排序,然後再將這個陣列 revsert。然後按照分數取 key 就好了。

    另外:你的分數不寫在資料庫裡,這樣拿出來本來就是有順序的啊

    回覆
    0
  • 取消回覆