如果选项类型为字母,则下面的代码将正确的字母和不正确的字母分开。例如,如果选项类型是A-D且正确的字母是B,则它使用$wrong
变量从A B C D中删除B,使其成为$incorrect_ans
变量的A C D.
现在我要做的是,如果选项类型为Yes or No
且正确答案为Yes
,则应将Yes
与Yes, No
分开,以便我可以显示No
变量中的incorrect_ans
。问题是,目前它没有拆分这两个选项,所以当在这个示例中No
应该是不正确的时候,它显示这个答案是不正确的答案。但是如何实现呢?
我希望同样适用于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;
我遇到的问题是,这不适用于问题2中的Yes or No
选项。错误答案为No
,问题2的正确答案为Yes
,但不会分割{ {1}}和Yes
因为它将它们都显示为不正确的答案。这是不正确的。
答案 0 :(得分:1)
稍微更新您的代码
$right = array($dbAnswer); // $right = array('True');
$incorrect_ans[] = array_diff( $options, $right );
array_diff
需要两个参数都是数组。您还可以var_dump
$option
变量以确保其包含正确的数据。
当然,最终的$incorrect_ans
数组可以同时包含“是”和“否”,因为在获取每一行时都会添加每个数组。 $incorrect_ans
的每个元素包含从解析的问题的错误答案。我认为你应该使用问题ID作为$incorrect_ans
的关键,而不仅仅是使用默认的数字键。