1

PHPを使用した最高スコアの計算に基づいて、配列から上位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

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 に答える