0

こんにちは、私は現在、コンテストのためにデータベース ベースのユーザー ID からクエリを実行しています。ただし、results_array で重複を選択することは避けたいと考えています。この関数 getrandomspecies は array_result を受け取ります。この配列の結果は 7 回繰り返されます。results_array に重複を入れていないことをどのようにテストしますか? 私はいくつかの複製を得ました。

    function getrandomspecies($array_result){

     //database connection
     $dbn = adodbConnect();

     foreach($array_result as $possible){

    //query the results
    $querys= "select * from taxonomic_units where tsn = $possible";
    $resultss = $dbn -> Execute($querys);

    while($rowss=$resultss->FetchRow()){

        $id = $rowss['tsn']; //there ID
        $ranksss = $rowss['rank_id']; //ranking id, I choose 220 and 230



            if($ranksss == 220 || $ranksss == 230){
                $prelimary_array[] = $id;

            }
        }


   //grab random index
   $index = array_rand($prelimary_array,1);

   //put result id into a variable 
   $newspecies = $prelimary_array[$index];

   //put that variable in an array
    $results_array[] = $newspecies; //there is 7 newspecies/winners at the end, I dont want duplicates
 }

  return $results_array;
}
4

4 に答える 4

0

これはどうですか?1 つのクエリでそれを行うことができます。

$querys= "select DISTINCT tsn from taxonomic_units where tsn IN (".implode(",",$array_result).") AND rank_id IN (220,230) ORDER BY RAND() LIMIT 7 ";
于 2013-08-06T18:21:16.030 に答える
0

MySQL は次のようになります。

select distinct tsn, rank_id from taxonomic_units where tsn = $possible

ただし、準備済みステートメントを使用するのが理想的です。

于 2013-08-06T18:19:48.017 に答える
0

結果配列をループし、存在しない場合は追加します。最終的に 7 未満になった場合は、大きなループをもう一度実行します。

この行を置き換えます:

$results_array[] = $newspecies;

に:

$loop_1_more_time=0;
if (isset($results_array)){
    foreach($results_array as $result){
        if ($result == $new_specie){
            $loop_1_more_time=1;
        }
    }
}
if ($loop_1_more_time == 0){
    $results_array[] = $newspecies;
}

//ここで、$loop_1_more_time が 1 の場合、もう一度開始します。もう一度始めて、6 つ以下ではなく 7 つになるようにするには、最初の大きな "foreach" ループを $array_result の count() に依存する "for" ループに置き換えると、$array_result は array_result になります。 [$i] $possible の代わりに。$i は 0 から始まり、ループの終了ごとにインクリメントされます。$loop_1_more_time==1; の場合はインクリメントされません。例 :

for ($i = 0; $i < count($array_result); $i++) {
    //stuff
    //if ($loop_1_more_time=1;) { $i--; }
}
于 2013-08-06T18:27:45.883 に答える
-1

配列をシャッフルして、最初の X 個の数字を選んでみませんか?

そうすれば、結果配列の重複をチェックするのではなく、そもそも出てこない

于 2013-08-06T18:14:12.013 に答える