Home  >  Article  >  Backend Development  >  php 多选题评分算法 求指导

php 多选题评分算法 求指导

WBOY
WBOYOriginal
2016-06-23 14:02:011502browse

PHP 算法

多选题一题3分
原则是:少选给2分,多选不给分,选错不给分
假如:正确答案123
提交答案 123 得3分 
提交答案 12,13,23,都可得2分 
提交答案 1234,234,134,124 没分
怎么实现,还是有更好的方法  

回复讨论(解决方案)

按你的描述,你的多选题不是用 checkbox 而是用 text 输入的
并且备选答案不会多于9个

于是得分可写作
count(array_intersect(str_split($正确答案), str_split($提交答案));

就是:分别切割成数组,然后取交集

用checkbox 备选答案就4个 1 2 3 4 

如果你是使用 checkbox
那么提交后得到的就是数组,与正确答案数组取交集就是了

具体代码 取完交集怎么判断了?

$正确答案 = array(1, 2, 3);
$提交答案 = array(1, 2);
$得分 = count(array_intersect($正确答案, $提交答案));
echo $得分; //2

$correct = array(1, 2, 3);
$submit = array(1, 2);
$score = count(array_intersect($correct, $submit));
echo $score; //2 


够直接!!!

$正确答案 = array(1, 2, 3);
$提交答案 = array(1, 2);
$得分 = count(array_intersect($正确答案, $提交答案));
echo $得分; //2
取交集和楼主的题目要求不符合吧,比如提交答案为数组array(1,2,4),那么交集也是(1,2),实际应该得0分吧。

是的,不完全符合。
但是选 1,2,4 就不得分是不合常理的。除非 4 是反选项,比如:都不是
如果是这样的话,出题者就是在有意误导答题者

如果非要这样出题的话,可以这样写

$正确答案 = array(1, 2, 3);$错误答案 = array(4);$提交答案 = array(1, 2, 4);$得分 = array_intersect($错误答案, $提交答案) ? 0 : count(array_intersect($正确答案, $提交答案));echo $得分; //0



引用 5 楼 xuzuning 的回复:$正确答案 = array(1, 2, 3);
$提交答案 = array(1, 2);
$得分 = count(array_intersect($正确答案, $提交答案));
echo $得分; //2
取交集和楼主的题目要求不符合吧,比如提交答案为数组array(1,2,4),那么交集也是(1,2),实际应该得0分吧。
……

交并差就可以了
答卷在前,答案在后
有差集,不给分
无交集,不给分(排除上一个后这个是考虑空白答卷的情况,如果确认不会有白卷这句可以不用)
无差集,有交集,交集数量!=答卷,半分
无差集,有交集,交集数量=答卷,满分(这个可以不写逻辑,直接用else也行,因为排除上面几种情况剩下就是交集相等)

注意
1.上面要顺序判断,是 else if 不相容逻辑而不是 switch 可容逻辑,因为省了一些判断条件
2.答卷和答案都要确保无重复值,不然交集数量判断会有问题

是的,不完全符合。
但是选 1,2,4 就不得分是不合常理的。除非 4 是反选项,比如:都不是
如果是这样的话,出题者就是在有意误导答题者

如果非要这样出题的话,可以这样写PHP code?12345$正确答案 = array(1, 2, 3);$错误答案 = array(4);$提交答案 = array(1, 2, 4);$得分 = array_interse……

呃,我上面写错了
交集数量!=答卷/交集数量=答卷
应该是
交集数量!=答案/交集数量=答案

可以用位运算来计算
A:1 B:2 C:4 D:8
如何选择AB 则为3
如何选择ABCD 则为15

比如正确为4 则 看看选择的结果为N跟4比
if(N==4) 3分
if 4&N==N 2分
其他 O分



可以用位运算来计算
A:1 B:2 C:4 D:8
如何选择AB 则为3
如何选择ABCD 则为15

比如正确为4 则 看看选择的结果为N跟4比
if(N==4) 3分
if 4&N==N 2分
其他 O分

位运算是不错的选择,选择肢 但更大就不太方便了

按照老大的思路,可以这样做

$correct = array(1, 2, 3);$submit = array(1, 2);$score = count(array_intersect($correct, $submit));if($score < count($submit)){//如果多选了给0分  $score = 0;}echo $score; //2

楼主 #11 的贴图与楼主 #2 的补充不符
既然是用 checkbox 提交的,提交答案就不会是 array( [0] => 12 ) 形式
而是 array( [控件名] => array( [0] => 1 [2] => 2) ) 这种形式
否则是需要拆分成数组后才能使用数组函数的

那个是每道题的答案 

贴出你的表单片段,我给你详细解释



#11的图 我是处理过的 这个每个数字对应一道题 

对呀,你的 name="answer66[]"
所以提交后(假定全部选中) $_POST['answer66'] 是 array(1, 2, 3, 4) 这样的数组
此时你同样需要把答案处理成 array(1, 2, 3) 这样的数组,才能应用数组函数
对于这一点,我 #1 的回复已经说了

function fen($a,$b){ //$a答案 $b正确答案	if($a==$b){		return 3;	}	foreach ($a as $value){		if(!in_array($value, $b)){			return 0;		}	}	return 2;}

只想到个笨方法

最后老师说 多选和少选都不给分 - -! 不过还是学习到很多东西了
#11的图 使用的代码是#9  不过这个问题先缓缓了 

 多选和少选都不给分
就用差集为空

交并差就可以了
答卷在前,答案在后
有差集,不给分
无交集,不给分(排除上一个后这个是考虑空白答卷的情况,如果确认不会有白卷这句可以不用)
无差集,有交集,交集数量!=答卷,半分
无差集,有交集,交集数量=答卷,满分(这个可以不写逻辑,直接用else也行,因为排除上面几种情况剩下就是交集相等)

注意
1.上面要顺序判断,是 else if 不相容逻辑而不是 switch 可容逻辑,因为省了一些判断条件
2.答卷和答案都要确保无重复值,不然交集数量判断会有问题

有差集就给不给分,如果 正确答案是:1 2 4  提交的答案是:1 2
哪他们的差集就是4,,按道理应该有一半的分的。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn