質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • PHP

    21349questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • mysqli

    162questions

    MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

phpでの配列結合

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 416

usushiki_025

score 19

前提・実現したいこと

phpとMySQLを使ってガチャを制作しています。
その時にガチャの結果として帰ってくるIDの配列とIDを元に取得したカード配列から最終的に画面出力するカード配列を作りたいです。

指定IDと同じIDの要素がカード配列のどこにあるか調べたい。

発生している問題

データベースから取得するカードは同じIDがあったとしてもひとつしか結果が返ってこないため、
最終的に表示するときカード枚数がIDの内容によって変わってしまう。

該当のソースコード

//ID配列
//実際はランダムに10個のIDを取得する(重複あり)
$id = array(1,3,6,4,4,10,5,16,8,9);

//データベースから取得したカード配列
//ID配列にあるIDのカードのみ(重複なし)
$cards = array(
array("id" => 1,
      "name" =>"",
      "rarity"=>""),
array("id" => 3,
      "name" =>"",
      "rarity"=>""),
array("id" => 4,
      "name" =>"",
      "rarity"=>""),
array("id" => 5,
      "name" =>"",
      "rarity"=>""),
array("id" => 6,
      "name" =>"",
      "rarity"=>""),
array("id" => 8,
      "name" =>"",
      "rarity"=>""),
array("id" => 9,
      "name" =>"",
      "rarity"=>""),
array("id" => 10,
      "name" =>"",
      "rarity"=>""),
array("id" => 16,
      "name" =>"",
      "rarity"=>""),
);



//最終的に作りたい配列
$arr = array(
array("id" => 1,
      "name" =>"",
      "rarity"=>""),
array("id" => 3,
      "name" =>"",
      "rarity"=>""),
array("id" => 6,
      "name" =>"",
      "rarity"=>""),
array("id" => 4,
      "name" =>"",
      "rarity"=>""),
array("id" => 4,
      "name" =>"",
      "rarity"=>""),
array("id" => 10,
      "name" =>"",
      "rarity"=>""),
array("id" => 5,
      "name" =>"",
      "rarity"=>""),
array("id" => 16,
      "name" =>"",
      "rarity"=>""),
array("id" => 8,
      "name" =>"",
      "rarity"=>""),
array("id" => 9,
      "name" =>"",
      "rarity"=>""),
);

・ループで作るとしてもidの順番がランダムのため難しい
・IDをソートして作っても表示はソート前のランダムの順番で出したいため元配列参照が必要になる。

補足情報

OS CentOS 6.6
言語 php5.4
サーバー Apache 2.2

何か良い方法がありましたら教えていただきたいです。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

check解決した方法

0

https://teratail.com/questions/42853
こちらを参考に解決しました。
回答ありがとうございました。

/**
     * 出力用カード配列を生成する
     * @param  array   $_id_list   IDリスト(重複あり)
     * @param  array   $_card_list カードリスト(重複なし)
     * @return array   出力用カードリスト
     */
    function create_output_card_list(array $_id_list,array $_card_list)
    {
        $result = [];

        foreach ($_id_list as  $value)
        {
            foreach ($_card_list as $key => $child)
            {
                if($child['id'] === $value)
                {
                    $result[] = $child;
                    break;
                }
            }
        }

        return $result;
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

どの様な出力を得たいのかがピンと来なかったのですが…
PHPで配列の検索をするのであれば、array_search使うとか、issetとかarray_key_exists等があるのでご自身の目的に合った関数を使うと良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

$idで指定するデータは必ずしもユニークではないということでしょうか?

ざっくりかくとこんな感じでしょうか?

$id = array(1,3,6,4,4,10,5,16,8,9);
$data=array_unique($id);
$sql="select * from hoge where 1 ";
if(count($data)>0){
  $sql.="and id in(".implode(",",array_fill(0,count($data),"?")).")";
}
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
$rec=[];
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  $rec[$row["id"]]=$row;
}
$arr=[];
foreach($id as $val){
  $arr[]=>["id"=>$val,"name"=>$rec[$val]["name",・・・]
}


※$cardsを$arrの仕様に変更しておきました
$recにデータを受けておいて、$idを回して$arrを設定するということ

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/23 12:11

    言葉足らずですみません。
    $idで指定するカードデータそのものはユニークですが、
    ガチャの仕様上複数回まわした時のカード(この場合は$idの値)重複はあり
    という認識です。
    開発環境上、カード配列は質問に書いた形式で返されるためクエリの結果から直接編集ができない状況になっています。

    キャンセル

  • 2017/03/23 12:16 編集

    > この場合は$idの値)重複はあり

    はい、それを前提に書いてあります。
    なにかおかしな点があればご指摘ください
    回答も$arrの仕様に合わせときました。

    キャンセル

0

一度カード情報をidをキーにした配列等にするか、
カード情報のインデックス番号を値にした配列にして
$idをループさせてカード情報をセットしていったらどうでしょうか。

例えばこんな感じで(記述はイメージで)

foreach($cards as $key => $card) {
    $idx[$card['id']] = $key;
}
foreach($id as $d) {
    $key = $idx[$d];
    $arr[] = $cards[$key];
}


まどろっこしい書き方ですがループの中でループさせて配列検索するよりも回数少ないですし同一カードも並びも変わらないので結果は望んでいるものかと。
もっとうまく書けそうですが。。。

5.5以上だったら例えばこんな感じでできそうです。(未検証)
※5.4でしたね。入力中に気づきました。

$column = array_column($cards, 'id');//idの配列を作成
foreach($id as $d) {
    $idx = array_serch($d, $ids)
    $arr[] = $cards[$idx];
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • PHP

    21349questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • mysqli

    162questions

    MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。