1

我不知道如何根据使用 php.ini 的最高分计算从数组中获取前 10 条记录。我从表中取出记录,执行计算并将结果存储在数组名称分数中,并与查询字符串(数组)的其余部分相关联,以便我可以将该计算带入 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

4 回答 4

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
于 2013-05-15T11:05:20.697 回答
2

我希望我已经正确理解了您,并且我认为最好的解决方案是对您的数组进行排序并获取前 10 个值。

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

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

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

于 2013-05-15T11:01:29.247 回答
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()的更多信息

希望对你有帮助

于 2013-05-15T11:16:01.143 回答
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 语句中总是一个坏、坏的主意。您应该改用准备好的语句

于 2013-05-15T11:32:29.517 回答