根据最高分数从阵列中查找前10条记录

时间:2013-05-15 10:55:40

标签: php arrays json sorting

我无法弄清楚如何根据使用php的最高得分计算从数组中获取前10个记录。我从表中取出记录,执行计算并将结果存储在数组名称分数中,并与查询字符串(Array)的其余部分相关联,这样我就可以将该计算带入JSON。我的问题是我只需要进行前10名得分最高的记录。

    $gold=$_GET['gold_input'];
    $silver=$_GET['silver_input'];
    $bronze=$_GET['bronze_input'];
    $gdp_value=$_GET['gdp_checked'];


    $link = new mysqli('localhost', 'root', '','coa123cdb');
    $myArray = array();

    $query = "SELECT  * FROM  coa123cdb.Country";

    $result = mysqli_query($link, $query)
    or die("Error: ".mysqli_error($link));

    $row_cnt = $result->num_rows;
    if ($result = $link->query($query)) {
    $tempArray = array();
    $score=array();

    $counter=0  ;
    while($row=mysqli_fetch_assoc($result)){

      $tempArray['country_name'] = $row['country_name'];
      $tempArray['gdp']=$row['gdp'];
      $tempArray['population']=$row['population'];
      $tempArray['gold']=$row['gold'];
      $tempArray['silver']=$row['silver'];
      $tempArray['bronze']=$row['bronze'];

                if($gdp_value==0)
            {
                        $score=($bronze*$tempArray['bronze'])+($silver*$tempArray['silver'])+($silver*$tempArray['gold']);

            }
            else
            {
            $score=($bronze*$tempArray[6]+$silver*$tempArray[5]+$silver*$tempArray[4])*$tempArray[1]/$tempArray[2]/10000;
            }
            $tempArray['score']=$score;
            $data[]=$tempArray;
            $counter++;
        }


       echo json_encode($data);
}

$result->close();
$link->close();

请告知我需要做什么才能将数组中的前10条记录传递给JSON对象。

4 个答案:

答案 0 :(得分:5)

首先,创建复杂的MySQL查询更好。

MySQL计算得分几乎是免费的,比较所有结果的返回成本和PHP中的计算。

我建议创建sql查询+“按分数限制10”。

SELECT  *,CASE gdp
WHEN 0 THEN bronze*silver
ELSE bronze*silver / 1000
END as score FROM coa123cdb.Country order by score desc limit 0,10

此代码用于在得分计算类型之间切换

CASE gdp
WHEN 0 THEN bronze*silver
ELSE bronze*silver / 1000
END

答案 1 :(得分:2)

我希望我能正确理解你,我认为最好的解决方案是对数组进行排序并获得前10个值。

要对数组进行排序,有很多功能。因为我懒得学习它们所有我更喜欢usort(),这让我可以完全控制正在做的事情。您可以按“得分”字段排序。也许有人会找到更好的功能。

要获取前10个元素,您可以使用简单的for循环。

如果您不想对源数组进行排序,您可以随时复制它。

答案 2 :(得分:1)

您必须先对数组进行排序,然后在获取记录时设置限制 试试这样的事情

  ---- your code above it ---

        $tempArray['score']=$score;
        $data[]=$tempArray;
        foreach($data as $value)
        {
           $score[]  = $value['score']
        }
        array_multisort($score, SORT_DESC,$data);

        $i = 0;
        $newArray = array();
        foreach($data as $value)
        {
            if($i < 10)
            {
                $newArray[] = $value;
            }
            $i++;
        }  


  --- code below----------  

$newArray将包含所需的数组...

您可以阅读有关array_multisort()

的更多信息

希望它可以帮到你

答案 3 :(得分:0)

由于ORDER BY...LIMIT方法效率更高,我会这样做。
请参阅代码内的注释以获得简短说明。

/* Initialize variables */
$gold      = $_GET["gold_input"];
$silver    = $_GET["silver_input"];
$bronze    = $_GET["bronze_input"];
$gdp_value = $_GET["gdp_checked"];
$data = array();

/* Construct the query based on user input.
   The query should calculate the 'score' (taking '$gdp_value' into account)
   and then return the 10 highest scoring entries.
   The returned columns include all columns present in the 'Country' table
   plus an extra column named 'score' (which contains the calculated score).*/
$scoreFormula = ($gdp_value == 0)
        ? "((" . $bronze . " * bronze) + (" . $silver . " * silver) + (" . $gold . " * gold))";
        : "(((" . $bronze . " * bronze) + (" . $silver . " * silver) + (" . $gold . " * gold)) * (gdp / (population * 10000)))";
$query = "SELECT Country.*, " . $scoreFormula . " AS score
            FROM Country
            ORBER BY score DESC
            LIMIT 10";

/* Connect to the DB and execute the query */
$link = new mysqli("localhost", "root", "", "coa123cdb");
$result = mysqli_query($link, $query)
    or die("Error: " . mysqli_error($link));

/* Put the results into the '$data' array */
$row_cnt = $result->num_rows;
forEach ($row = mysqli_fetch_assoc($result)) {
    $data[] = $row;
}

/* Release resources */
$result->close();
$link->close();

/* Return the data */
echo(json_encode($data));

注意
该代码仅用于说明目的。将未经过滤的用户输入放入SQL语句总是一个坏的, BAD 的想法。您应该使用 prepared statement