1

以下のコードは、オプション タイプが文字の場合、正しい文字と間違った文字を区別します。たとえば、オプション タイプが AD で、正しい文字が B の場合、変数を使用して ABCD から B を削除し、$wrong変数を ACD にし$incorrect_ansます。

ここでやりたいことは、オプションのタイプがYes or Noで正解がの場合、変数で表示できるようにからYes分離する必要があるということです。問題は、現時点ではこれらのオプションの両方が分割されていないため、この例では間違っているはずの回答が間違った回答として表示されていることです。しかし、これはどのように達成できますか?YesYes, NoNoincorrect_ansNo

オプションでも同じように動作するようにしTrue or Falseます。前述したように、私のコードは文字の回答に対して機能しますが、Yes or NoまたはTrue or False.

以下はコードです:

$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 = $dbAnswer; // $right = 'True';
    $wrong = array_diff($options, $right);
    $incorrect_ans[] = $wrong;
}

アップデート:

このデータがデータベースにある場合

質問表:

QuestionId QuestionNo OptionId
11          1         3
12          2         26

Option_Table テーブル:

OptionId OptionType
1        A-C
2        A-D
3        A-E

..............

26       Yes or No

回答表:

AnswerId Answer QustionId
1        A      11
2        C      11
3        Yes    12

わかりましたので、質問 1 (表をよく見てください) については、オプションの種類 ($OptionType) はA-E、以下のコードを使用して意味します。

(preg_match('/^([A-Z])-([A-Z])$/', $dbOptionType, $match)) {
        $options = range($match[1], $match[2]);

これらのオプションが表示されますA B C D E

現在、問題 1 の正解は A と C です ( を使用$right = $dbAnswer;)。したがって、次を使用して、正解から不正解を分割します。

$wrong = array_diff($options, $right);

次に、のような間違った答えが残りB D Eます。これらは、次を使用して配列に格納されます。

$incorrect_ans[] = $wrong;

Yes or No私が抱えている問題は、これが質問2のオプションでは機能しないことです。質問2の正解は不正解ですがNoYes分割されずYesNo両方が不正解として表示されるためです。これは正しくありません。

4

1 に答える 1

2

コードを少し更新する

$right = array($dbAnswer); // $right = array('True');
$incorrect_ans[] = array_diff( $options, $right );  

array_diff両方のパラメーターが配列である必要があります。変数に正しいデータが含まれていることを確認するvar_dumpこともできます。$optionもちろん、最終的な$incorrect_ans配列には「はい」と「いいえ」の両方を含めることができます。これは、各行をフェッチするときにそれぞれが追加されるためです。の各要素には、解析元の質問$incorrect_ansの間違った回答が含まれています。デフォルトの数値キーを使用するだけでなく、質問IDをキーとして使用する必要があると思います。$incorrect_ans

于 2013-01-16T19:41:56.470 に答える