PHP多选题怎么弄,php多选题评分算法求指导解决方法

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

那么提交后得到的就是数组,与正确答案数组取交集就是了

------解决方案--------------------

$正确答案 = array(1, 2, 3);

$提交答案 = array(1, 2);

$得分 = count(array_intersect($正确答案, $提交答案));

echo $得分; //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

引用:引用:$正确答案 = 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.答卷和答案都要确保无重复值,不然交集数量判断会有问题

------解决方案--------------------

可以用位运算来计算

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分

位运算是不错的选择,选择肢<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中文网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值