2013-05-08 82 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

相关问题