0

以下は、各質問の正解と不正解です。

Question Number: 1   Correct Answer(s) B     Incorrect Answers A C D
Question Number: 2   Correct Answer(s) A C   Incorrect Answers B D
Question Number: 3   Correct Answer(s) D     Incorrect Answers A B C

問題は、複数の回答 (複数の正解) がある質問に対して間違った回答を取得する方法です。質問の正解が 1 つしかない場合に不正解を取得しても問題はなく、正解が複数あるだけです。

以下は、間違った回答が表示される現在の方法と、それがどのように表示されるかを示しています (問題がどこにあるかがわかるように、以下に色分けしました)。

ここに画像の説明を入力

質問に複数の正解がある場合、その質問内ですべての回答をループし、1 つの正解を削除して残りの回答を表示し、すべての回答を再度ループして削除するようです。別の 1 つの正しい答えを表示し、現在の答えの残りを表示します。

したがって、A と C はA、質問 2 で表示される最初の一連の不正解から削除され、質問 2 でC2 番目の不正解のセットから削除されたため、正解であると認識されます。質問ごとに各行の不正解。

私の質問は、ディスプレイがどのように見えるように修正するにはどうすればよいですか?

現在の出力のコードは次のとおりです。

<table border='1' id='penaltytbl'>
<thead>
<tr>
<th class='questionth'>Question No.</th>
<th class='answerth'>Incorrect Answer</th></tr>
</thead>
<tbody>
<?php
$row_span = array_count_values($searchQuestionNo);
    $q_counter = 1;// counter for $row_span
    $i = key($row_span);  // gets first question number
    foreach ($incorrect_ans as $key => $val){
        if($q_counter == 1){
            $q_row_span[$i] = count($val);}
        else{
            $q_row_span[$i] += count($val);}
        if($q_counter >= $row_span[$i]){
            $q_counter = 1;
            $i++;}
        else{
            $q_counter++; }
    }
$prev_ques = '';
foreach($searchQuestionNo as $key=>$questionNo){

?>

<tr class="questiontd">
    <?php
    if($questionNo != $prev_ques){
    ?>
    <td class="questionnumtd q<?php echo$questionNo?>_qnum" rowspan="<?php echo$q_row_span[$questionNo]?>">
    <?php echo$questionNo?><input type="hidden" name="numQuestion" value="<?php echo$questionNo?>" />
    </td>
    <?php
    }  

    foreach($incorrect_ans[$key] as $answer){ ?>
    <td class="answertd"><?php echo$answer?></td>
</tr>
<?php
    }
$prev_ques = $questionNo;
}
?>
</tbody>
</table>

以下のコードは、各質問の不正解を取得して配列に格納する方法を示しています。このコードは、上記の HTML テーブルの上に表示されます。

$specialOptionTypes = array('Yes or No' => array( 'Yes', 'No' ),'True or False' => array( 'True', 'False' ));

while ($stmt->fetch()) {

// Do this for each row:
if ( array_key_exists( $dbOptionType, $specialOptionTypes ) ) {
    $options = $specialOptionTypes[$dbOptionType];
} else if ( preg_match( '/^([A-Z])-([A-Z])$/', $dbOptionType, $match ) ) {
    $options = range( $match[1], $match[2] );
} else {
    // issue warning about unrecognized option type
    $options = array();
}
$right = str_split( $dbAnswer ); 
$wrong = array_diff( $options, $right );  

        $searchQuestionNo[] = $dbQuestionNo;
        $incorrect_ans[] = $wrong;
      } 

アップデート:

列の後に追加の列がある場合Incorrect Answer、以下のコードはレイアウトを台無しにします:

<tbody>
<?php

foreach($ques_ans as $questionNo => $inc_ans)
{
    $q_row_span = count($inc_ans);
    ?>
    <tr class="questiontd">
        <td class="questionnumtd q<?php echo $questionNo?>_qnum" rowspan="<?php echo $q_row_span ?>">
                <?php echo $questionNo?><input type="hidden" name="numQuestion" value="<?php echo $questionNo?>" />
        </td>
        <?php

        foreach ($inc_ans as $ans)
        {
        ?>
            <td class="answertd"><?php echo $ans; ?></td>
          <?php  
            }
          ?>         
            <td class="questionnumtd q<?php echo $questionNo?>_qnum" rowspan="<?php echo $q_row_span ?>">
        <?php echo $questionNo?><input type="hidden" name="numQuestion" value="<?php echo $questionNo?>" />
        </td>
        </tr>
        <?php
}
?>
</tbody>
4

2 に答える 2

1

これはまさにあなたの出力がどのようになりたいかです

<?php
$incorrect_ans = array(
                   array('A','C','D'),
                   array('B','C','D'),
                   array('A','B','D'),
                   array('A','B','C'));

$searchQuestionNo = array(
                   1,
                   2,
                   2,
                   3);

$ques_ans = array();    //to store incorrect answers against ques no.

$q_occ_count = array_count_values($searchQuestionNo);
foreach($searchQuestionNo as $key => $questionNo)
{
    if ( ! array_key_exists($questionNo, $ques_ans))
    {
        if($q_occ_count[$questionNo] === 1) //if a ques has only one correct ans
        {
            $ques_ans[$questionNo] = $incorrect_ans[$key];  //store the array of incorrect ans against the ques no as key 
        }
        else //if a ques has more than 1 correct ans
        {
            //find the intersection of incorrect_ans arrays for this ques
            $q_keys = array_keys($searchQuestionNo, $questionNo);
            $q_incorrect_ans = $incorrect_ans[$q_keys[0]];
            foreach($q_keys as $q_key) {
                $q_incorrect_ans = array_intersect($q_incorrect_ans, $incorrect_ans[$q_key]);
            }       
            $ques_ans[$questionNo] = $q_incorrect_ans;  //store the array of incorrect ans against the ques no as key
        }
    }
}
var_dump($ques_ans);
?>
<table border='1' id='penaltytbl'>
<thead>
<tr>
<th class='questionth'>Question No.</th>
<th class='answerth'>Incorrect Answer</th></tr>
</thead>
<tbody>
<?php

foreach($ques_ans as $questionNo => $inc_ans)
{
    $q_row_span = count($inc_ans);
    ?>
    <tr class="questiontd">
        <td class="questionnumtd q<?php echo $questionNo?>_qnum" rowspan="<?php echo $q_row_span ?>">
                <?php echo $questionNo?><input type="hidden" name="numQuestion" value="<?php echo $questionNo?>" />
        </td>
        <?php

        foreach ($inc_ans as $ans)
        {
        ?>
            <td class="answertd"><?php echo $ans; ?></td>
        </tr>
        <?php
        }
}
?>
</tbody>
</table>

デモ

上記のコードは、正解が 3 つある場合でも機能します

アップデート

ここにコードを追加するのではなく、いくつかの変更を加えただけで、 デモが更新されました

于 2013-01-12T07:34:43.067 に答える
0

これは機能しませんか?

foreach($searchQuestionNo as $key => $qNum)
{
    $answers = $incorrect_ans[$key];
    $aCount = count($answers);
    $i = 0;
    foreach($answers as $answer)
    {
        echo '<tr>';
        if($i == 0)
        {
           echo "<td class='questionnumtd q{$qNum}_qnum' rowspan='$aCount'>$qNum";
           echo "<input type='hidden' name='numQuestion' value='$qNum' />";
           echo "</td>";
        }
        echo "<td class='answertd'>$answer</td>";
        echo "</tr>";
        $i++;
    }
}

例: http://ideone.com/7asOjm

于 2013-01-12T06:36:53.863 に答える