2013-05-08 28 views
0

我有一個名爲view.htm的頁面,根據用戶分配給金牌,銀牌和銅牌的結果顯示結果,以及他們是否選擇使用gdp或人口來計算得分從view.php。我需要找到一種方法,以通過計算得分排序這些結果,然後將其限制在排名前10的。我的數據是從MySQL數據庫中接收到的,分數是在php頁面中計算的。我正在使用json_encode對數據進行編碼以在頁面上顯示它。 $results是一個二維數組。這是結果是什麼,當你從view.php呼應出來,如:如何使用計算值來排序數組,其中從mysql數據庫接收其餘數據?

{"gold":"0","silver":"0","bronze":"1","gdp":"20343461030","population":"34385000", 
"country_name":"Afghanistan","score":"0.029082448742184"},{"gold":"0", 
"silver":"0","bronze":"0","gdp":"12959563902","population":"3205000", 
"country_name":"Albania","score":"0"},{"gold":"1","silver":"0","bronze":"0", 
"gdp":"188681000000","population":"35468000","country_name":"Algeria", 
"score":"0.14097214390436"} 

下面是用於計算得分的PHP代碼:

$results = array(); 

while ($row = $res->fetchRow()){ 
    $resGold = $row['gold']; 
    $resSilver = $row['silver']; 
    $resBronze = $row['bronze']; 
    $resGdp = $row['gdp']; 
    $resPopulation = $row['population']; 
    $resCountry = $row['country_name']; 

    $gold_score = ($resGold * $gold_value); 
    $silver_score = ($resSilver * $silver_value); 
    $bronze_score = ($resBronze * $bronze_value); 

    $total_medals = ($resGold + $resSilver + $resGold); 
    $perMillion = $resPopulation/1000000; 
    $perBillion = $resGdp/1000000000; 

    $score_pop = (($gold_score + $silver_score + $bronze_score)/$perMillion); 
    $score_gdp = ($perBillion/($gold_score + $silver_score + $bronze_score + 1)); 

    if($population == 'true'){ 
     $row['score'] = "$score_pop"; 
     array_push($results,$row); 
    } 

    else if($gdp == 'true'){ 
     $row['score'] = "$score_gdp"; 
     array_push($results,$row); 
    } 
} 

任何幫助表示讚賞。 謝謝

回答

0

我會嘗試計算數據庫端的分數並將其限制在那裏。喜歡的東西

select gold,silver,bronze,gdp,population,country_name,(gold * $gold_value + silver * $silver_value + bronze * $bronze_value)/(population/1000000) as score from table sort by score desc limit 0,10

select gold,silver,bronze,gdp,population,country_name,(gdp/1000000000)/(gold * $gold_value + silver * $silver_value + bronze * $bronze_value + 1) as score from table sort by score desc limit 0,10

取決於人口和GDP值。 在任何情況下,您都應該注意表中所含的信息量,如果表現開始下降,則可能需要將預先計算的分數保留在單獨的列中,並在其餘部分信息被更新。

1

您應該可以使用array_multisort對結果進行排序 - 但您需要製作一個列表式的分數數組。因此,在推送結果的位置,也可以推入新的陣列。

縮...基本上是初始化新的陣列,並在那裏你推到$結果,也推到$分數

$results = array(); 
$scores = array(); 
while ($row = $res->fetchRow()){ 
    /* snipped */ 
    array_push($results,$row); 
    array_push($scores,$score_pop); 
} 

array_multisort($scores, SORT_ASC, $results); 

和工作的例子(實際上我測試過)

$result = array(
      array("name" => "guy", "score" => 30), 
      array("name" => "dude", "score" => 1), 
      array("name" => "bro", "score" => 20), 
    ); 

$scores = array(); 
    foreach ($result as $r) { 
      array_push($scores,$r['score']); 
    } 

array_multisort($scores,SORT_ASC,$result); 

    print_r($result); 

(我對錶格/空格表示歉意)

+0

它沒有訂購它 – 2013-05-08 15:36:49

相關問題