シャッフル後の2項目の表示方法は?

このQ&Aのポイント
  • 小テストのプログラムで、ソースに問題文を3題分用意し、ページを開くたびにランダムに2題だけを表示させる方法を教えてください。
  • for文で指定しても上手く動かないため、他の方法が必要です。
  • お願いします。
回答を見る
  • ベストアンサー

シャッフルした後で最初の2項目だけを表示させたい

小テストのプログラムなのですが、ソースには問題文を3題分用意して、ページを開くたびにランダムに2題だけを表示させるにはどうしたらいいのでしょうか? おそらくfor文で指定するのだと思いますが、うまく動いてくれません。 どうぞよろしくお願いいたします。 <? $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"=>"q2","text"=>"質問B") ,"A"=>array( array("key"=>1,"text"=>"回答B-1") ,array("key"=>2,"text"=>"回答B-2") ,array("key"=>3,"text"=>"回答B-3") ,array("key"=>4,"text"=>"回答B-4") ) ); $QA[]=array( "Q"=>array("id"=>"q3","text"=>"質問C") ,"A"=>array( array("key"=>1,"text"=>"回答C-1") ,array("key"=>2,"text"=>"回答C-2") ,array("key"=>3,"text"=>"回答C-3") ,array("key"=>4,"text"=>"回答C-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"; } $q_no++; } ?>

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • mikemike7
  • ベストアンサー率87% (97/111)
回答No.1

$q_no++; の上に if($q_no >= 2){break;} で抜けてくれると思いますよ。 if($q_no >= 2){break;} $q_no++;

shenzongse
質問者

お礼

どうもありがとうございました。 初心者なので一日中四苦八苦していましたが、まさかこんなに短いスクリプトで解決できるとは。。。 ぜひまたよろしくお願いいたします。

関連するQ&A

  • セッションについて教えてください。

    ラジオボタンを使った選択式の小テストのプログラムを作っています。テストのページを複数にしたいのですが、どのようにセッション関数を使えば良いのか分かりません。 下記のプログラムですと、1ページ目に答えた内容が2ページ目で上書きされてしまうようです。 どうぞよろしくお願いいたします。 1~2ページ目(テストのページ) <? $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"=>"q2","text"=>"質問B") ,"A"=>array( array("key"=>1,"text"=>"回答B-1") ,array("key"=>2,"text"=>"回答B-2") ,array("key"=>3,"text"=>"回答B-3") ,array("key"=>4,"text"=>"回答B-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 >= 2){ break; } $q_no++; } ?> 3ページ目(採点ページ) <?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; } print "正解数 " . $seikaisuu . "問"; print "<br>"; print "合計点 " . $tokuten . "点"; ?>

    • ベストアンサー
    • 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
  • 参照変数の親配列を取得

    データの多次元配列があって、値に応じて動的に関数を選択し 中身の値を引数で渡すみたいな感じの処理をしています ほとんどの処理は中身の値だけあれば事足りるのですが 稀にキー値を使いたい処理がでてきます 本当に稀なので引数にキー値も渡すようにするのは 無駄が多くなるように思うので避けたく できれば参照変数で渡される値から 親配列でのキー値を取得したいと思っています $arr2A=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); $arr2B=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); $arr2C=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); foreach($arr2A as $key=>$val){ $fncs[$val['fnc']]($val); } foreach($arr2B as $key=>$val){ $fncs[$val['fnc']]($val); } foreach($arr2C as $key=>$val){ $fncs[$val['fnc']]($val); } $fncs=array( A=>function(&$arr){ }, B=>function(&$arr){ }, C=>function(&$arr){ //ここで稀にキー値も使いたい }); 実際のコードはかなり長いので載せられませんが 要約すると上記のような感じの処理です まずどのデータ配列の集合から渡されたのかが明確ではありませんので indexOfなどでキー値を得るのというのが難しいです 現在は、その処理が必要なデータ行について処理前に 中身にキー値をあらかじめ入れてしまう というように対応しているので、一応解決はしているのですが もし参照変数から親配列を得る方法が あればと思い質問させていただきました ”そんなものはない”という回答も あきらめつくのでお願いします

    • ベストアンサー
    • PHP
  • シャッフルした変数を正しく表示するには?

    多肢選択式試験問題のプログラムを作っています。 MySQLに格納されている各問題と選択肢をシャッフルして出題し、セッションを使って採点ページに進むと出題された問題と選択肢を表示させたいのです。 しかし下記のソースだと問題と選択肢が1題分しか表示されず、選択肢も出題ページに表示された順番には並んでくれません。 これはどうしたらいいのでしょうか?よろしくお願い致します。 //出題のページ ※選択肢Aを選ぶと正解になります。 <?php session_start(); ?> $arr = array(); while ($row = mysqli_fetch_array($result)){ $arr[] = $row; } shuffle($arr); $cnt = 0; foreach($arr as $row){ if($cnt >= 2){break;} print $row['question']; print "<BR>"; $choices = array(); $choices['a'] = "<INPUT type=radio name=radi_".$cnt." value=a>".$row['choices_a']."<BR>"; $choices['b'] = "<INPUT type=radio name=radi_".$cnt." value=b>".$row['choices_b']."<BR>"; $choices['c'] = "<INPUT type=radio name=radi_".$cnt." value=c>".$row['choices_c']."<BR>"; $choices['d'] = "<INPUT type=radio name=radi_".$cnt." value=d>".$row['choices_d']."<BR>"; session_register(sesdata_q); session_register(sesdata_a); session_register(sesdata_b); session_register(sesdata_c); session_register(sesdata_d); $_SESSION[sesdata_q] = $row['question']; $_SESSION[sesdata_a] = $row['choices_a']; $_SESSION[sesdata_b] = $row['choices_b']; $_SESSION[sesdata_c] = $row['choices_c']; $_SESSION[sesdata_d] = $row['choices_d']; shuffle($choices); foreach($choices as $val){ print $val; } print "<BR>"; $cnt++; } ?> //採点のページ <?php $score = 0; $answer = $_POST['radi_0']; if($answer == 'a'){ $score++; } $answer = $_POST['radi_1']; if($answer == 'a'){ $score++; } $answer = $_POST['radi_2']; if($answer == 'a'){ $score++; } $answer = $_POST['radi_3']; if($answer == 'a'){ $score++; } print "2問中" . $score . "問正解"; print "<br>"; print "<br>"; print $_SESSION[sesdata_q]; print "<br>"; print $_SESSION[sesdata_a]; print "<br>"; print $_SESSION[sesdata_b]; print "<br>"; print $_SESSION[sesdata_c]; print "<br>"; print $_SESSION[sesdata_d]; ?>

    • 締切済み
    • PHP
  • シャッフルしたデータを正確に引き継ぎたい

    試験問題のプログラムを作っています。 MySQLに格納されている問題文と選択肢をシャッフルして表示し、ユーザーからは見えない選択肢aを選ぶと正解で得点が1カウントされるものです。 問題用紙のページではきちんと問題と選択肢が表示されるのですが、セッションを使い採点のページに進むとMySQLに入っている問題文と選択肢が大量に表示されてしまいました。 ユーザーが採点のページに進むとどの問題を間違えたのか確認できるように問題用紙のページと同じように表示させたいのですが、これはどのようにコードを書けばよいのでしょうか? どうぞよろしくお願い致します。 //問題用紙のページ <?php session_start(); ?> <form method="post" action="grading.php"> <?php $arr = array(); while ($row = mysqli_fetch_array($result)){ $arr[] = $row; } shuffle($arr); $cnt = 0; foreach($arr as $row){ if($cnt >= 3){break;} print $row['question']; print "<BR>"; $choices = array(); $choices['a'] = "<INPUT type=radio name=radi_".$cnt." value=a>".$row['choices_a']."<BR>"; $choices['b'] = "<INPUT type=radio name=radi_".$cnt." value=b>".$row['choices_b']."<BR>"; shuffle($choices); foreach($choices as $val){ print $val; } session_register('sesdata_q'); session_register('sesdata_a'); session_register('sesdata_b'); $_SESSION['sesdata_q'][] = $row['question']; $_SESSION['sesdata_a'][] = $row['choices_a']; $_SESSION['sesdata_b'][] = $row['choices_b']; print "<BR>"; $cnt++; } ?> <INPUT type="submit" value=" 採点 " name="grading"> //採点のページ <?php session_start(); $score = 0; $answer = $_POST['radi_0']; if($answer == 'a'){ $score++; } $answer = $_POST['radi_1']; if($answer == 'a'){ $score++; }print "3問中" . $score . "問正解"; print "<br>"; foreach($_SESSION['sesdata_q'] as $val){ print $val."<BR><BR>"; } foreach($_SESSION['sesdata_a'] as $val){ print $val."<BR><BR>"; } foreach($_SESSION['sesdata_b'] as $val){ print $val."<BR><BR>"; } ?>

    • ベストアンサー
    • PHP
  • 連想配列でキーを利用して一部分を引き抜きたい

    PHP5.2.4を使用しています。 配列で一部分を引き抜く関数は次のようなarray_spliceで、 $arr = array('a' => 1, 'b' => 2, 'c' => 3); $arr2 = array_splice($arr, 1/*←ここに'b'と書きたい*/, 1); print_r($arr2);//←Array ( [b] => 2 ) print_r($arr);//Array ( [a] => 1 [c] => 3 ) これは第2引数に添え字の番号(上の例だと1)を指定しなければいけないのですが、 そうではなくて、キー('a'や'b'など)を指定して引き抜きたいです。 そのような関数などはあるのでしょうか?

    • ベストアンサー
    • PHP
  • phpとmysqlでサイトのコンテンツを制作しているのですが...

    phpとmysqlでサイトのコンテンツを制作しているのですが、どうにも解決できないのでどなたかアドバイスをいただけないでしょうか? mysqlで $result = @mysql_query( 'drop tabl main_categories;' ); $sqlstr = "create table main_categories (id INTEGER primary key AUTO_INCREMENT,"."category TEXT)"; $result = mysql_query( $sqlstr ); としてテーブルを作ってこれをphpでデータを取得し格納したいのですがうまくいきません。取得データを $arr=mysql_fetch_array($result); で格納してforeachで出力?したいのですが。。。 foreach( $arr as $key => $value ) { if($value['category'] != ''){ array_push($categories_arr,$value['category']); array_push($catid_arr,$value['id']); } } どなたか教えてください!もう8hはまってます=3

    • 締切済み
    • PHP
  • smartyでtplファイルでの2次元配列

    お世話になります。 smartyでtplファイル内で2次元配列を書きたいのですがどのようにアクセスしたらいいでしょう? foreachを入れ子にして使いたいのですが なかなかうまくいきません。 *このように使いたいのです PHP側 $txtA_ary[$page][$page_count]//こんな感じに各値が入る $form->addElement('text','txtA',$txtA_ary); tpl側 {foreach key=a_key item=a_item from=$form.txtA.label} {foreach key=b_key item=a_item from=$form.txtA.label.a_key} {$form.txtA.label.$a_key.$b_key} {/foreach} {/foreach}

    • ベストアンサー
    • 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
  • foreach文について、今朝、回答いただいて、その時は分かったつもり

    foreach文について、今朝、回答いただいて、その時は分かったつもりだったのですが、 やっぱりよく分かっていなかったようなので、もう一度質問させてください。 今朝質問した内容は、下記です。 ▼配列の要素の値をループ中に変更して確認したいのですが、   http://okwave.jp/qa/q5943567.html 例えば、下記例のとき、上記と挙動が異なるのは、なぜでしょう? このforeachでは、値を書き換えできないので、 そもそも、上記と比較をしてはいけないのでしょうか? $arr = array("値1", "キー1" => "値2", "値3"); foreach($arr as $val){ $val = "{$val}の値利用"; echo $val."<br />"; } foreach($arr as $val){ echo $val."<br />"; } 1)$arrの内容を$valにコピー 2)$valに値を代入 3)$valを表示 4)1)へ戻る で、特に分からないのが、以下です。 上のforeachで、 代入後の値が表示されるのは、 なぜでしょうか。 今朝質問した「$arr as $key => $val」 のときと比較して、 どなたか解説していただけないでしょうか?

    • ベストアンサー
    • PHP