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

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

新規登録して質問してみよう
ただいま回答率
85.48%
mysqli

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

PHP

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

Q&A

解決済

4回答

1538閲覧

phpでの配列結合

usushiki_025

総合スコア27

mysqli

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

PHP

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

0グッド

0クリップ

投稿2017/03/23 02:30

編集2017/03/23 02:50

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

指定IDと同じIDの要素がカード配列のどこにあるか調べたい。
###発生している問題
データベースから取得するカードは同じIDがあったとしてもひとつしか結果が返ってこないため、
最終的に表示するときカード枚数がIDの内容によって変わってしまう。

###該当のソースコード

php

1//ID配列 2//実際はランダムに10個のIDを取得する(重複あり) 3$id = array(1,3,6,4,4,10,5,16,8,9); 4 5//データベースから取得したカード配列 6//ID配列にあるIDのカードのみ(重複なし) 7$cards = array( 8array("id" => 1, 9 "name" =>"", 10 "rarity"=>""), 11array("id" => 3, 12 "name" =>"", 13 "rarity"=>""), 14array("id" => 4, 15 "name" =>"", 16 "rarity"=>""), 17array("id" => 5, 18 "name" =>"", 19 "rarity"=>""), 20array("id" => 6, 21 "name" =>"", 22 "rarity"=>""), 23array("id" => 8, 24 "name" =>"", 25 "rarity"=>""), 26array("id" => 9, 27 "name" =>"", 28 "rarity"=>""), 29array("id" => 10, 30 "name" =>"", 31 "rarity"=>""), 32array("id" => 16, 33 "name" =>"", 34 "rarity"=>""), 35); 36 37 38 39//最終的に作りたい配列 40$arr = array( 41array("id" => 1, 42 "name" =>"", 43 "rarity"=>""), 44array("id" => 3, 45 "name" =>"", 46 "rarity"=>""), 47array("id" => 6, 48 "name" =>"", 49 "rarity"=>""), 50array("id" => 4, 51 "name" =>"", 52 "rarity"=>""), 53array("id" => 4, 54 "name" =>"", 55 "rarity"=>""), 56array("id" => 10, 57 "name" =>"", 58 "rarity"=>""), 59array("id" => 5, 60 "name" =>"", 61 "rarity"=>""), 62array("id" => 16, 63 "name" =>"", 64 "rarity"=>""), 65array("id" => 8, 66 "name" =>"", 67 "rarity"=>""), 68array("id" => 9, 69 "name" =>"", 70 "rarity"=>""), 71);

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

###補足情報
OS CentOS 6.6
言語 php5.4
サーバー Apache 2.2

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

自己解決

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

php

1/** 2 * 出力用カード配列を生成する 3 * @param array $_id_list IDリスト(重複あり) 4 * @param array $_card_list カードリスト(重複なし) 5 * @return array 出力用カードリスト 6 */ 7 function create_output_card_list(array $_id_list,array $_card_list) 8 { 9 $result = []; 10 11 foreach ($_id_list as $value) 12 { 13 foreach ($_card_list as $key => $child) 14 { 15 if($child['id'] === $value) 16 { 17 $result[] = $child; 18 break; 19 } 20 } 21 } 22 23 return $result; 24 }

投稿2017/03/23 03:32

usushiki_025

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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]; }

投稿2017/03/23 03:17

no-bu

総合スコア75

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

PHP

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

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

投稿2017/03/23 02:53

編集2017/03/23 03:21
yambejp

総合スコア114823

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usushiki_025

2017/03/23 03:11

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

2017/03/23 03:21 編集

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

0

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

投稿2017/03/23 02:47

motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問