php 多选题评分算法 求指导 PHP算法 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 按你的描述,你的多选题不是用 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 超厉害,CSDN果然高手云集 谢谢了 我先看看 $correct = array(1, 2, 3);$submit = array(1, 2);$score = count(array_intersect($correct, $submit));echo $score; //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 交并差就可以了答卷在前,答案在后有差集,不给分无交集,不给分(排除上一个后这个是考虑空白答卷的情况,如果确认不会有白卷这句可以不用)无差集,有交集,交集数量!=答卷,半分无差集,有交集,交集数量=答卷,满分(这个可以不写逻辑,直接用else也行,因为排除上面几种情况剩下就是交集相等)注意1.上面要顺序判断,是 else if 不相容逻辑而不是 switch 可容逻辑,因为省了一些判断条件2.答卷和答案都要确保无重复值,不然交集数量判断会有问题 可以用位运算来计算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分 位运算是不错的选择,选择肢<32个(因系统和php版本可能多至63),很方便但更大就不太方便了 按照老大的思路,可以这样做$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) ) 这种形式否则是需要拆分成数组后才能使用数组函数的 对呀,你的 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;}只想到个笨方法 php中用ajax怎么返回二维数据 数组问题,大虾来看看 用this关键字访问数组变量 用php可以编一个在线扑克牌的程序吗? php重構 论坛登陆了就有关键字,没登陆就没有关键字, 用什么程序能打开my sql数据库? 用php对一个txt文件写入的问题? 请问这个框架的问题 我的机子未上网,也没网卡,内否配置php+mysql的运行平台 关于给图片加水印 pHp include 和 request的问题!(include文件不执行,直接将php源码输出
并且备选答案不会多于9个于是得分可写作
count(array_intersect(str_split($正确答案), str_split($提交答案));就是:分别切割成数组,然后取交集
那么提交后得到的就是数组,与正确答案数组取交集就是了
$提交答案 = array(1, 2);
$得分 = count(array_intersect($正确答案, $提交答案));
echo $得分; //2
$submit = array(1, 2);
$score = count(array_intersect($correct, $submit));
echo $score; //2
够直接!!!
但是选 1,2,4 就不得分是不合常理的。除非 4 是反选项,比如:都不是
如果是这样的话,出题者就是在有意误导答题者如果非要这样出题的话,可以这样写$正确答案 = array(1, 2, 3);
$错误答案 = array(4);
$提交答案 = array(1, 2, 4);
$得分 = array_intersect($错误答案, $提交答案) ? 0 : count(array_intersect($正确答案, $提交答案));
echo $得分; //0
答卷在前,答案在后
有差集,不给分
无交集,不给分(排除上一个后这个是考虑空白答卷的情况,如果确认不会有白卷这句可以不用)
无差集,有交集,交集数量!=答卷,半分
无差集,有交集,交集数量=答卷,满分(这个可以不写逻辑,直接用else也行,因为排除上面几种情况剩下就是交集相等)注意
1.上面要顺序判断,是 else if 不相容逻辑而不是 switch 可容逻辑,因为省了一些判断条件
2.答卷和答案都要确保无重复值,不然交集数量判断会有问题
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分
位运算是不错的选择,选择肢<32个(因系统和php版本可能多至63),很方便
但更大就不太方便了
$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
既然是用 checkbox 提交的,提交答案就不会是 array( [0] => 12 ) 形式
而是 array( [控件名] => array( [0] => 1 [2] => 2) ) 这种形式
否则是需要拆分成数组后才能使用数组函数的
所以提交后(假定全部选中) $_POST['answer66'] 是 array(1, 2, 3, 4) 这样的数组
此时你同样需要把答案处理成 array(1, 2, 3) 这样的数组,才能应用数组函数
对于这一点,我 #1 的回复已经说了
if($a==$b){
return 3;
}
foreach ($a as $value){
if(!in_array($value, $b)){
return 0;
}
}
return 2;
}
只想到个笨方法