以下のコードは、オプション タイプが文字の場合、正しい文字と間違った文字を区別します。たとえば、オプション タイプが 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の正解は不正解ですがNo、Yes分割されずYes、No両方が不正解として表示されるためです。これは正しくありません。