PHPのランダムループにラジオボタンを付加

このQ&Aのポイント
  • PHPのコードには、問題の不正解を複数呼び出し、正解を1つ呼び出してシャッフルして表示させる機能があります。
  • しかし、このコードにラジオボタンを付け加えることは難しいようです。
  • 正しい文法を使ってコードにラジオボタンを追加する方法を模索してください。
回答を見る
  • ベストアンサー

PHP ランダムループへのラジオボタン付加

$loop = 3; $count = 0; if (count($mondai) > $loop) { $selected_keys = array(); while ($count < $loop){ $hazure_key = mt_rand(0, count($mondai) - 1); if (in_array($hazure_key, $selected_keys)) { continue; } array_push($selected_keys, $hazure_key); $mondai_hyouji[$count] = $mondai[$hazure_key]; $count++; } } $mondai_hyouji[3] = $mondai[$seikai_key]; $numbers = range(0, 3); shuffle($numbers); foreach ($numbers as $number){ echo "$mondai_hyouji[$number]"; } 問題の不正解を複数呼び出し、正解を1つ呼び出してシャッフルして表示させています。 これらにラジオボタンを付けたいと思ったのですが文法エラーになってしまいます。 上記のコードに付け加えるのは難しいでしょうか?

  • PHP
  • 回答数4
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • Reginleif
  • ベストアンサー率37% (9/24)
回答No.4

ええと、まず前回までの分を整理しましょうか。 echoというのはエコーって読むんですが、文字列を出力するものです。 それで私の3回目のレスに書いている文字列連結という意味は $mondai_hyouji[$count] = "<input type=\"radio\" name=\"kotae\" value=\"不正解です!\"/>".$mondai[$hazure_key]; $mondai_hyouji[3] = "<input type=\"radio\" name=\"kotae\" value=\"正解です!\"/>".$mondai[$seikai_key]; という形で問題に対して連結すればいけるんじゃないですか?というのが主旨です。 つまり、そのタイミングでechoする、というわけでは無く 選択させたい問題の文字列にラジオボタンを追加する、という方法のヒントでした。 なので3回目のレスお礼に書かれているコードのようにセット時にechoするのではなく 上記のように配列にセットする際に文字列連結で問題と一緒にセットすると いくらシャッフルしようが配列の中にその文字が入っているので問題ないはずです。

padora
質問者

お礼

すみません…勘違いしてました… 仰る通りに配列にラジオボタン毎突っ込んだら表示されました! ラジオボタンしか表示されなかったのですがどうにかしてやってみます! 重ね重ねありがとうございました!

その他の回答 (3)

  • Reginleif
  • ベストアンサー率37% (9/24)
回答No.3

ああ、ただのコードサンプルでしたので・・すいません。解りにくかったですよね(・ω・;) 表示用の変数にセットする前に入れてしまえば、一緒にシャッフルされませんか? $mondai_hyouji[$count] = $mondai[$hazure_key]; とか $mondai_hyouji[3] = $mondai[$seikai_key]; の辺りで一緒にセットすればいけそうですが。。 あと文字列の連結は . (ピリオド)を使えば可能です。 "あ"."い"."う" という感じに。

padora
質問者

お礼

いえ!表示できただけでも前進できたのでありがたいです! echo "<input type=\"radio\" name=\"kotae\" value=\"不正解です!\"/>$yomi[$hazure_key]"; $yomi_hyouji[$count] = $yomi[$hazure_key]; echo "<input type=\"radio\" name=\"kotae\" value=\"正解です!\"/>$yomi[$seikai_key]"; $yomi_hyouji[3] = $yomi[$seikai_key]; こんな感じでしょうか? それでもシャッフルしたものを表示したらラジオボタンが外れてしまいました…

  • Reginleif
  • ベストアンサー率37% (9/24)
回答No.2

つまり echo "<input type="radio" name="kotae" value="不正解です!"/>$mondai_hyouji[$hazure_key]<br/>"; と記述していたのでしょうか? それならばタグ中の「"」が文字列を表す「"」と混同してしまうので、それをエスケープしなければいけません。 それが文法エラーのもとになります。 type="radio" name="kotae" value="不正解です!" 6個の"がありますよね。 それをエスケープ文字を使って、文字列の「"」として認識させる必要があります。 例。 type=\"radio\" という感じですね。

padora
質問者

お礼

echoを使わずにformでやってました… echoを使うことによってボタンの精製はできました!ありがとうございます!エスケープ文字も勉強になりました。 シャッフルの後に付けたらボタンだけになってしまいました、 シャッフルしてしまった配列の中身に個別のボタンを付加するのは難しいでしょうか?質問ばかりですみません

  • Reginleif
  • ベストアンサー率37% (9/24)
回答No.1

ラジオボタンの記述はどのようにされましたか? タグの中にダブルクォート(")が含まれているなら もう1ステップ用意してそっちエスケープして、echoするなどの方法もありかもしれません。

padora
質問者

お礼

ありがとうございます!

padora
質問者

補足

<input type="radio" name="kotae" value="不正解です!"/>$mondai_hyouji[$hazure_key]<br/> をループの中に入れて、 <input type="radio" name="kotae" value="正解です!"/>$mondai_hyouji[$seikai_key]<br/> を正解の後につけようとしました。 シャッフルの後につけるべきだったでしょうか? 何を選んだのか記憶しておきたいのですが、ループやシャッフルをしているのでどう記述すればよいのかこんがらがってしまいました…

関連するQ&A

  • PHPの配列の出力について

    $loop = 5; $count = 0; while($count < $loop){ mt_srand(microtime() * 100000); $rand_key = rand(0,9); if (in_array($rand_key, $yomi)){ $count--; continue; } echo $yomi[$rand_key]\n; } 配列($yomi)に格納されたひらがなから5つ重複させずに選び出したいのですが、 randで選出された「りんご」が2度選び出された場合、これでやり直しされますか? 現在出力出来る環境がありません… 初心者ですので指摘やアドバイス等いただけると嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • ランダム関数による抽出について

    現在 $id には抽選される対象のID $del_id 当選した人や除外対象のID こちらの2つは配列に格納されています。 現在下記のようにプログラムを作成しましたが、 同じIDが登録されてしまいます。 何かよい手はないでしょうか? $rand_keys = array_rand($id,3); for($k=0;$k<count($rand_keys);$k++){ //当選した人は除く処理 for($a=0;$a<count($del_id);$a++){ while($del_id[$a] == $id[$rand_keys[$k]]){ $rand_keys = array_rand($id,3); } } }

    • ベストアンサー
    • PHP
  • ラジオボタンをループすることができない。。。

    こんにちは。 PHPとMySQLを使って四択クイズのプログラムを作成しているのですが、どうもうまくいきません。 助言よろしくお願いします。 四択クイズのイメージとしては以下のとおりです。 問題1:パンはパンでも食べられないパンは? ○クリームパン ○食パン ○フライパン ○チーズパン [送信ボタン] ※選択肢の前の○はラジオボタンです。 一つのページに複数の問題を載せたいので、 上記の[送信ボタン]をのぞいた部分をループ処理したいと思っています。 問題文と選択肢は実行するファイルとは別のファイル、「mondai.sql」に記述してデータベースに読み込んでいます。↓ drop table form2; create table form2(id mediumint not null auto_increment, mondai varchar(500), sentaku1 varchar(100),sentaku2 varchar(100),sentaku3 varchar(100), sentaku4 varchar(100),primary key(id)); insert into form2 values('1', 'パンはパンでも食べられないパンは?', 'クリームパン', '食パン', 'フライパン', 'チーズパン'); そして実行するファイルの「form2.php」を下のように記述してみたのですが・・・ ・ ・ ・ //----------------------------------------- //サーバに接続 //----------------------------------------- $my_Con = mysql_connect("localhost","root","vertrigo"); if($my_Con == false){ die("MYSQLの接続に失敗しました。"); } //----------------------------------------- //データベースに接続 //----------------------------------------- if(!mysql_select_db("kihon",$my_Con)){ die("データベースの選択に失敗しました。"); } //----------------------------------------- //テーブルからデータを読む //----------------------------------------- $my_Row = mysql_query("select * from form2",$my_Con); if(!$my_Con){ die(mysql_error()); } while($row = mysql_fetch_array($my_Row)){ echo $row["id"]; echo "<br>"; echo $row["mondai"]; echo "<br>"; ?> <input type="radio" name=mondai1 value=1> <?php echo $row["sentaku1"]; echo "<br>"; ?> <input type="radio" name=mondai1 value=2> <?php echo $row["sentaku2"]; echo "<br>"; ?> <input type="radio" name=mondai1 value=3> <?php echo $row["sentaku3"]; echo "<br>"; ?> <input type="radio" name=mondai1 value=4> <?php echo $row["sentaku4"]; echo "<br>"; } このままだとラジオボタンのnameが同じになってしまって全ての問題の選択肢から一つしか選べなくなってしまいました。 かといってnameをfor文でループさせることもできませんでした。 このプログラムにどのようにしてループを組み込めばいいかまったくわかりません。 長い質問で申し訳ないのですが、どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPのシンプルな構文(初心者)

    ランダムに出る掛け算の答えを入力して 別ファイルで正解か不正解という表示をする構文なのですが 「input type="hidden"」部分の値の出力・受取りができず 正しく実行がされません。 どこが間違っているのでしょうか? よろしくお願いいたします。 in.php -------------------------------------- <?php $saki = rand(1,9); $ato = rand(1,9); echo "$saki X $ato"; $seikai = $saki*$ato; ?> <html> <body> <form method="post" action="out.php"> <input type="text" name="kotae"> <input type="hidden" name="hid" value="<?php $seikai ?>"> ←※ <input type="submit" value="回答"> </form> </body> </html> -------------------------------------- out.php -------------------------------------- <?php $kotae = $_POST["kotae"]; $seikai = $_POST["hid"];     ←※ if($kotae == $seikai){ echo "正解です"; }else{ echo "間違っています。"; } echo "<hr>正解は{$seikai}です。"; ?> --------------------------------------

    • ベストアンサー
    • PHP
  • phpでcsvデータをランダム表示について

    下記はcsvデータをランダムに1つだけ抽出するphpのプログラムですが、1度表示したデータに色をつけるとか、表示させない方法はありますか? <!doctype html> <html> <head> <meta charset="UTF-8"> <title>無題ドキュメント</title> </head> <body> <?php // 抽出数 $count = 1; $list = array(); // 読み込みCSVファイル $lines = file('test.csv'); shuffle($lines); foreach ($lines as $line) { if ( ! in_array($line, $list)) { array_push($list, $line); if (count($list) >= $count) { break; } } } // CSVファイルに出力 $file = fopen('test2.csv', 'w'); foreach ($list as $l) { echo $l.'<br>'; if ($file) { fputs($file, $l); } } fclose($file); ?> </body> </html>

    • ベストアンサー
    • PHP
  • array_rand関数

    現在、ランダム関数を使用して、配列にある値の中から ランダムにいくつかの配列を抜き出す処理を行っています。 $rand_keys = array_rand($id,2); for($k=0;$k<count($rand_keys);$k++){  $rand_id[$i][$k]=$id[$rand_keys[$k]]; } ただし、この関数では一つだけ取り出したい場合には使えません。 何かよい方法はありませんか??

    • ベストアンサー
    • PHP
  • ランダム表示させたあとその結果を受け取るには?

    小テストのプログラムを作っています。6問ある問題の中からランダムに5問を出題させて、合計点と正解数を表示させることができました。 ただこのままでは回答者はどの問題を間違えたのかがわからないので、出題された問題と解説文を表示させたいのです。 解決のヒントをお願いいたします。 //問題文のページ <FORM method="POST" action="answer.php"> <?php $QA[]=array( "Q"=>array("id"=>"q1","text"=>"質問A") ,"A"=>array( array("key"=>1,"text"=>"回答A-1") ,array("key"=>2,"text"=>"回答A-2") ,array("key"=>3,"text"=>"回答A-3") ,array("key"=>4,"text"=>"回答A-4") ) ); . . . . $QA[]=array( "Q"=>array("id"=>"q6","text"=>"質問F") ,"A"=>array( array("key"=>1,"text"=>"回答F-1") ,array("key"=>2,"text"=>"回答F-2") ,array("key"=>3,"text"=>"回答F-3") ,array("key"=>4,"text"=>"回答F-4") ) ); shuffle($QA); $q_no=1; foreach($QA as $arr1){ shuffle($arr1["A"]); print "問".$q_no." ".$arr1["Q"]["text"]."<br>\n"; foreach($arr1["A"] as $arr2){ $id=$arr1["Q"]["id"]."_".$arr2["key"]; print "<INPUT type=\"radio\" id=\"".$id."\" name=\"".$arr1["Q"]["id"]."\" value=\"".$arr2["key"]."\"><label for=\"".$id."\">".$arr2["text"]."</label><br>\n"; } if($q_no >= 5){ break; } $q_no++; } ?> <INPUT type="submit" value=" OK " name=namae> //解答のページ <?php $tokuten = 0; $seikaisuu = 0; $answer = $_POST["q1"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = +1; } $answer = $_POST["q2"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } $answer = $_POST["q3"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } $answer = $_POST["q4"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } $answer = $_POST["q5"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } $answer = $_POST["q6"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } print "正解数 " . $seikaisuu . "問"; print "<br>"; print "合計点 " . $tokuten . "点"; ?>

    • ベストアンサー
    • PHP
  • 配列の次元を超えてランダムに選択したい

    PHP5.2.4を使用しています。 例えば、次のような2次元以上の配列があったときに $arr[0][0] = array('a' => 1, 'b' => 11); $arr[0][1] = array('a' => 2, 'b' => 5); $arr[0][2] = array('a' => 3, 'b' => 20); $arr[1][0] = array('a' => 4, 'b' => 3); $arr[1][1] = array('a' => 5, 'b' => 30); この5つから、'b'の値が10以上の候補だけのインデックス($arr【[1][1]】←この部分)を ランダムに1つ選ぶ方法はどのようになるのでしょうか? 自分が考えたのは for ($i = 0; $i < count($arr); $i++) {  for ($j = 0; $j < count($arr[$i]); $j++)  {   if ($arr[$i][$j]['b'] < 10)    continue;   $new_arr[] = array('index2' => $i, 'index1' => $j);  } } $key = array_rand($new_arr, 1); print_r($new_arr[$key]); //Array ( [index2] => 0 [index1] => 0 ) //Array ( [index2] => 0 [index1] => 2 ) //Array ( [index2] => 1 [index1] => 1 ) //いずれかが選択される なんですが、これだとあまり良いやり方だと思わなくて なにか別のやり方はあるのでしょうか?

    • 締切済み
    • PHP
  • シンプルなPHPのフォームテスト

    ランダムにでた計算の答えの値を フォームによって送信して正解か間違っているかを表示する PHPプログラムを考えてみたのですが上手くいきません。 in.php ------------------------------------------ <html> <body> <?php $saki = rand(1,9); $ato = rand(1,9); echo "計算:{$saki}X{$ato}="; $seikai = $saki*$ato; echo '<form action="out.php" method="post">'; echo '<input type="text" name="kotae">'; echo '<input type="hidden" name="hidden" value="$seikai">'; echo '<input type="submit" value="回答"></form>'; ?> </body> </html> ------------------------------------------ out.php ------------------------------------------ <html> <body> <?php $kotae = $_POST["kotae"]; $seikai = $_POST["hidden"]; if($kotae == $seikai){ echo "正解です"; }else{ echo "間違いです"; } ?> </body> </html> ------------------------------------------ in.phpファイルのインプットタグhiddenの所と out.phpファイルでの$_POST["hidden"]の受け取り部分が 間違っているのだと思いますが 正しくはどのようにしたらいいのでしょうか? もっとシンプルで分かりやすい書き方もあれば お教えください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPに関する質問です。

    PHPに関する質問です。 データベースからfetchしたデータを 10件づつとりだしグループ化して、最後の残りが8件以下の場合は、各グループの配列の先頭に加えるという処理を行う際に、このような記述をしているのですが、 $data = array(); // 保存する配列 $ct1 = 0; $ct2 = 0; while($row = $res->fetch(PDO::FETCH_NUM)) { if ($ct2 === 10) { $ct1++; $ct2 = 0; } if ($ct2 === 0) { $data[$ct1] = array(); } $data[$ct1][] = $row; $ct2++; } if (count($data[$ct1]) < 8) { $arr = array_pop($data); $x = floor(count($arr) / count($data)); // 各要素に割り当てる数 for ($i = 0; $i < count($data); $i++) { for ($j = 0; $j < $x; $j++) { array_push($data[$i], array_pop($arr)); } } $t = 0; while (count($arr) > 0) { // 最後のあまりを先頭に追加 array_push($data[$t], array_pop($arr)); $t++; } } この処理だと、生成された配列が3次元になってしまいます。 Array ( [0] => Array ( [0] => Array ( [0] => あ ) [1] => Array ( [0] => あ) [2] => Array ( [0] => あ) [3] => Array ( [0] => あ) [4] => Array ( [0] => あ) [5] => Array ( [0] => あ ) [6] => Array ( [0] => あ ) [7] => Array ( [0] => あ) [8] => Array ( [0] => あ ) [9] => Array ( [0] => あ ) [10] => Array ( [0] => あ) ) [1] => Array ( [0] => Array ( [0] => あ) [1] => Array ( [0] => あ) [2] => Array ( [0] =>あ ) [3] => Array ( [0] => あ ) [4] => Array ( [0] => あ ) [5] => Array ( [0] => あ ) [6] => Array ( [0] => あ) [7] => Array ( [0] => あ ) [8] => Array ( [0] => あ ) [9] => Array ( [0] => あ ) [10] => Array ( [0] => あ ) ) [2] => Array ( [0] => Array ( [0] => あ ) [1] => Array ( [0] => あ) [2] => Array ( [0] => あ ) [3] => Array ( [0] => あ ) [4] => Array ( [0] => あ) [5] => Array ( [0] => あ ) [6] => Array ( [0] => あ ) [7] => Array ( [0] => あ ) [8] => Array ( [0] => あ ) [9] => Array ( [0] => あ) [10] => Array ( [0] => あ ) ) [3] => Array ( [0] => Array ( [0] => あ ) [1] => Array ( [0] => あ ) [2] => Array ( [0] => あ ) [3] => Array ( [0] => あ ) [4] => Array ( [0] => あ ) [5] => Array ( [0] => あ) [6] => Array ( [0] => あ ) [7] => Array ( [0] => あ ) [8] => Array ( [0] => あ ) [9] => Array ( [0] => あ) ) ) これを array([0]=>array(あ,あ,あ,あ,あ,あ,あ)[1]=>array(あ,あ,あ,あ,あ,あ,あ)) のように2次元で取り出すには、どのように行えばいいでしょうか。 この後の処理としては、 $key = 'a'; array_search($key,$data) のようにキーを取得したいと考えています。 宜しくお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう