php和mysql仿excel的rank函數

來源:互聯網
上載者:User

標籤:rank php mysql

    php仿excel的rank函數也是借鑒網上的代碼,但是沒有二維數組情況下的進行rank排名,所以自己對代碼稍微改了一下,可以直接運行實驗。

<?php$arr = array(          array(‘s‘=>‘99‘,‘r‘=>‘1‘,‘a‘=>‘a‘),          array(‘s‘=>‘99‘,‘r‘=>‘1‘,‘b‘=>‘b‘),          array(‘s‘=>‘100‘,‘r‘=>‘2‘,‘c‘=>‘c‘),          array(‘s‘=>‘101‘,‘r‘=>‘3‘,‘d‘=>‘d‘)        );echo ‘<pre>‘;print_r(rank($arr,‘s‘,‘r‘));//獲得一組數的名次的數組function rank(array $array,$s,$r){        foreach($array as $k=>$v){          $marr[] = $v[$s];        }        foreach($array as $val){          $repeat=get_array_repeats($val[$s],$marr);          $num=gt_array_values($val[$s],$marr);          $rank[$r]=count($marr)-$num-$repeat+1;          $rank2[] = array_merge($val,$rank);        }        return $rank2;}//獲得比自己數小的個數function gt_array_values($val,array $array){        $num=0;        for($i=0;$i<count($array);$i++){                if($val>$array[$i]){                        $num++;                }        }        return $num;}//獲得這個數的重複次數function get_array_repeats($string,array $array) {        $count = array_count_values($array);        foreach ($count as $key => $value) {                 if ($key == $string) {                  return $value;                  }         }}

邏輯也很簡單,學生的名次,等於總人數減去比自己成績低的人數,再減去和自己成績一樣的人數,再加一。

比自己成績低的人數,和與自己成績一樣多的人數,分別是兩個獨立的函數,前者需要迴圈所有學產生績,比自己成績低的進行人數累加,每個學生都要進行這個迴圈,有點耗效能哈。後者只是單純引用數組函數解決問題。

這樣就可以根據考試成績(欄位名s),得到考生的排名(欄位名r),但是很明顯迴圈次數有點多,難以想象當資料量很大的時候情況是怎樣的,所以還是建議查詢的時候直接執行sql語句實現rank函數功能,這個網上有不少例子,如MySQL中rank函數如何?

    在這個例子中,當我們要尋找id為1的學員的rank值的時候,直接運行sql語句如下:

select tmp.id,tmp.name,tmp.score,@j:[email protected]+1 as j,@k:=(case when @pre_score=tmp.score then @k else @j end) as rank,@pre_score:=tmp.score as pre_scorefrom (select * from score where id =1) as tmp,(select @k :=0,@j:=0, @pre_score:=0)as mscore

j是順序號,k是rank值

@k:=(case when @pre_score=tmp.score then @k else @j end

這句話意思是只有在前後二次排序值不同時才會使用順序號,是關鍵的地方。

最後運行sql,用getRow函數得到id為1的這條資料,得到rank值。

本文出自 “飛天馬鈴薯神教” 部落格,請務必保留此出處http://1105190775.blog.51cto.com/10048144/1891460

php和mysql仿excel的rank函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.