繁体   English   中英

我如何使用计算值对数组排序,其余数据是从mysql数据库接收的?

[英]How do I order an array using a calculated value, where the rest of the data is received from mysql database?

我有一个名为view.htm的页面,该页面根据用户分配给金牌,银牌和铜牌的内容以及他们是否选择使用gdp或人口从view.php计算得分来显示结果。 我需要找到一种方法来按计算出的分数这些结果进行排序,然后将其限制在前10位 我的数据是从mysql数据库接收的,并且在php页面中计算了分数。 我正在使用json_encode编码数据以将其显示在页面上。 $results 是一个二维数组。 当您从view.php中回显结果时,结果如下所示:

{"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);
    }
}  

任何帮助表示赞赏。 谢谢

您应该可以使用array_multisort对结果进行排序-但您需要创建一个分数的列表样式数组。 因此,在您推动结果的地方,也要推动一个新的数组。

缩写...本质上是初始化新数组,在这里您压入$ results,也压入$ scores

$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);

(我对制表符/空格表示歉意)

我会尝试在数据库方面计算分数并将其限制在那。 就像是

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值。 无论如何,您应该谨慎使用表中包含的信息量,并且如果性能开始下降,则值得保留一个单独的列,其中包含预先计算的得分,该得分将在其余信息时更新已更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM