1

コンテキスト:データベースにクエリを実行して、単純な Web ベースの RPG 内での戦闘で使用される指定された数のモンスターを返しています。

問題:モンスターの「レベル」を決定するための WHERE 句を含む単純な MYSQL クエリがあります。前の関数で、返す必要がある対応するモンスターのレベルを含む配列を作成しています。何かのようなもの:

$levels = Array( [0] => 3 [1] => 1 [2] => 1 ) 

したがって、上記の配列では、Value はレベルに対応します。なので、レベル3、レベル1、レベル1の3体のモンスターを返そうと思っています。

十分に単純です。次に、次のように MYSQL をクエリし、おそらくループを使用してクエリを 3 回実行し、3 つのモンスターを取得します。何かのようなもの:

$query = "SELECT *, CardHP as EncounterCardHP, CardAP as EncounterCardAP";
$query .= " FROM Cards";
$query .= " WHERE CardTypeId = 1 AND CardRarity = {$level}";
$query .= " ORDER BY RAND() LIMIT 1";

したがって、上記のクエリでは、変数 {$level} は前の配列のモンスター レベルです。ループのフォーマットは、私が苦労しているところです。私は次のようなことを試みています:

while ($i = $levels) {
     $query = "SELECT *, CardHP as EncounterCardHP, CardAP as EncounterCardAP";
     $query .= " FROM Cards";
     $query .= " WHERE CardTypeId = 1 AND CardRarity = {$i}";
     $query .= " ORDER BY RAND() LIMIT 1";
 $result_set = mysql_query($query, $connection);
 confirm_query($result_set);
 return $result_set;    
}

これは近いと思いますが、最終的に MYSQL から単一のモンスターの配列を得るためにこれを取得する方法がわかりません。上記のようですが、3つの別々の配列を構築していますか? array_merge() を使用する必要がありますか、またはこれを行うためのよりシンプルでエレガントな方法はありますか? 同じレベルのモンスターをすべて取得する場合は、クエリを 1 回実行して LIMIT 3 にするだけで済みますが、前の配列が示すものに対応するモンスターが必要です。

理にかなっていますか?ヘルプはいつでも大歓迎です。

4

4 に答える 4

2

あなたが何をしようとしているのか完全にはわかりませんが、これはループして配列を取得するはずです:

foreach ($levels as $key => $value) {
    $query = "SELECT *, CardHP as EncounterCardHP, CardAP as EncounterCardAP FROM Cards WHERE WHERE CardTypeId = 1 AND CardRarity = {$value} ORDER BY RAND() LIMIT 1";
    $results = mysqli_query($connection, $query);
    while($row = $result->fetch_array(MYSQLI_BOTH)) {
        $monsters[$key]['HP'] = $row['CardHP'];
        //Add as needed
    }
}

最初のキーがレベルのキーと同じで、後続のキーが SQL クエリの結果である多次元配列を作成します。

$monsters = array(
    [0] => array(
        ['HP'] => 10
        ['AP'] => 5
    )
    [1] => array(
        ['HP'] => 5
        ['AP'] => 7
    )
)

また、mysqli は手続き型スタイルとオブジェクト指向をサポートしており、代わりに mysqli 接頭辞が付いていますが、ほとんどの関数はまったく同じであるため、おそらく使用する方が適しています。

于 2013-01-14T07:23:04.247 に答える
1

WHERE INはあなたが必要なものだと思います。

$query = "SELECT *, CardHP as EncounterCardHP, CardAP as EncounterCardAP";
$query .= " FROM Cards";
$query .= " WHERE CardTypeId = 1 AND CardRarity IN (".implode(',', $levels).")";
$query .= " ORDER BY RAND() LIMIT 1";
于 2013-01-14T07:08:06.117 に答える
0

実際、思ったよりずっと簡単でした。多分私は問題を過度に説明しました。これが私がしたことです。

1)次のような配列$levelsを返したら:

$levels = Array( [0] => 3 [1] => 1 [2] => 2 ) 

2)$ result_setという空の配列を作成しました。2)次に、foreachループを使用して$ Levels配列をループし、$levels配列の最初の$levelを使用してクエリを実行しました。ただし、最初の行が返された状態で$ result_setを返すだけでなく、手順2で作成した空の配列に最初の行を挿入しました。各ループスルーの後、MYSQLから新しい行を埋められた$result_set配列に挿入しました。

最終的には次のようになります。

$result_set = array();
foreach ($levels as $level) {
    $query = "SELECT *, CardHP as EncounterCardHP, CardAP as EncounterCardAP";
    $query .= " FROM Cards";
    $query .= " WHERE CardTypeId = 1 AND CardRarity = {$level}";
    $query .= " ORDER BY RAND() LIMIT 1";
    $result = mysqli_query($query, $connection);
    $result_set[] = mysqli_fetch_array($result);    
    confirm_query($result_set);
}
return $result_set;     

$ result_setには、レベル3、レベル1、レベル2の3つのモンスターが含まれています。これらはすべて、それぞれのレベルのデータベースからランダムに選択されています。

すべての助けをありがとう。

于 2013-01-16T05:22:39.543 に答える