php - 配列の各フィールドに独自の変数を与える方法

原文 php pdo

私は数人の友人が(懐かしさのために)プレイできる小さなテキストベースのWebゲームに取り組んでいますが、ゲームの核心である攻撃/防御に問題があります。

各プレイヤーは各部隊タイプのxの量を持っています(より多くを購入でき、ATK / DEFで失われます)
これまでのところ、部隊のタイプと統計の表と、ユーザーIDと部隊IDにリンクされた部隊の数量の表があります。

ユーザーIDを使用して部隊IDと数量を取得しています。

//攻撃部隊の数量を取得します。

$i = 0;
$attacker_deets = $conn->prepare("SELECT * FROM troop_qty WHERE user_id= :attacker_id");
$attacker_deets->bindParam(':attacker_id', $attacker_id);
$attacker_deets->execute();

    $attacker_deets_results = $attacker_deets->fetchAll(PDO::FETCH_ASSOC);
        foreach($attacker_deets_results as $atk_key=>$atk_result) {
             echo "<pre>"; var_dump($atk_result); echo "</pre>";
        }


どの出力;

array (size=4)
    'troop_qty_id' => string '1' (length=1)
    'user_id' => string '2' (length=1)
    'troop_id' => string '1' (length=1)
    'qty' => string '100' (length=3)

array (size=4)
    'troop_qty_id' => string '2' (length=1)
    'user_id' => string '2' (length=1)
    'troop_id' => string '2' (length=1)
    'qty' => string '100' (length=3)


次に、部隊IDを使用して部隊の詳細を取得します。

//攻撃部隊の詳細を取得します。

    $attacker_troop_deets = $conn->prepare("SELECT * FROM troops WHERE troop_id= :atk_troop_id");
    $attacker_troop_deets->bindParam(':atk_troop_id', $attacker_deets_results[$i]['troop_id']);
    $attacker_troop_deets->execute();
    $returned_results = $attacker_troop_deets->fetchAll(PDO::FETCH_ASSOC);
        foreach($returned_results as $key=>$result) {
             echo "<pre>"; var_dump($result); echo "</pre>";                
        }
    ++$i;


合計で私に与える;

array (size=4)
  'troop_qty_id' => string '1' (length=1)
  'user_id' => string '2' (length=1)
  'troop_id' => string '1' (length=1)
  'qty' => string '100' (length=3)

array (size=4)
  'troop_id' => string '1' (length=1)
  'troop_name' => string 'Fist Puncher' (length=12)
  'troop_atk' => string '1' (length=1)
  'troop_def' => string '1' (length=1)

array (size=4)
  'troop_qty_id' => string '2' (length=1)
  'user_id' => string '2' (length=1)
  'troop_id' => string '2' (length=1)
  'qty' => string '100' (length=3)

array (size=4)
  'troop_id' => string '2' (length=1)
  'troop_name' => string 'Stick Waver' (length=11)
  'troop_atk' => string '2' (length=1)
  'troop_def' => string '1' (length=1)


ここで行き詰まっているのは、First Puncherのtroop_atkを、重複したクエリの異なるセットがディフェンダーの詳細を取得して取得したStick Waverの防御と比較できるようにする必要があることです。また、乗算と除算ができる必要があります。 atkおよびdef変数。

どうすればこれを達成できますか?配列内の各フィールドに独自の変数を指定する必要があると思いますが、どうやって? $ {"troop_name"を使ってみました。 $ i} = $ attacker_deets_results [$ i] ['troop_name'];ただし、最後に入力された名前のみが出力されます。

どんな助けでも素晴らしいでしょう。ありがとう。

編集:少し物事を片付けるために、私の目標は、部隊の数を取得し、それをatkとdefの両方で乗算し、これらの数値を使用して、防御側プレーヤーの同じフィールドで他の数学を実行し、数量フィールド。
答え
多分あなたはあなたのコードを少し修正して次のことをすることができます。

1つのクエリでユーザーの兵士に関するデータを取得します。

    $results = $conn->query("SELECT troop_qty.user_id as uid, troop.troop_id, troop.troop_name, troop_qty.qty, troop.troop_atk, troop.troop_def FROM troop_qty join troop on troop.troop_id=troop_qty.troop_qty_id WHERE troop_qty.user_id=:attacker_id


すべてのユーザーの軍隊に関する情報を含む新しい配列を作成します。

$userData = array(
    'id' => $attacker_id,
    'troops' => array());

while (($res = $results->fetch_assoc()) != null) {
    $troopData = array(
        'name' => $res['troop_name'],
        'qty' => $res['qty'],
        'atk' => $res['troop_atk'],
        'def' => $res['troop_def']);

    $userData['troops'][$res['troop_id']] = $troopData;
}


結果として、次のようになります(vardump($ userData)):

array (size=2)
  'id' => int 2
  'troops' => 
    array (size=2)
      1 => 
        array (size=4)
          'name' => string 'Fist Puncher' (length=12)
          'qty' => string '100' (length=3)
          'atk' => string '1' (length=1)
          'def' => string '1' (length=1)
      2 => 
        array (size=4)
          'name' => string 'Stick Waver' (length=11)
          'qty' => string '100' (length=3)
          'atk' => string '2' (length=1)
          'def' => string '1' (length=1)


ゲームの後半でデータをどのように操作したいのか正確にはわかりませんが、これで作業が楽になると思います。

ところで個人的には、すべてのデータをメモリにフェッチして変更したり、何かを行うことはお勧めできないので、fetchAll()関数を捨てました。これはメモリの浪費であり、大量のデータを処理するときに、ある時点で問題が発生する可能性があります。
関連記事

php - pdoステートメントで制限値をバインドする方法

php - mysqlデータベースからblob画像として取得すると画像が壊れる

php - Symfony2:ルーターは正しいコントローラーを使用していません

php - Symfony2 PHP制限1ユーザーセッション20

javascript - SVGパスが互いに隣接しているかどうかを確認しますか?

php - symfony2 phpunit-機能テストエラー(host_with_path)

php - スパークラインでの動的データの解析

javascript - データがJavaScriptからPHPに渡されないのはなぜですか

javascript - jquery onchangeが機能していません

php - Woocommerceで属性を取得する