PHP多选题怎么弄,php多选题评分算法求指导解决方法
php 多選題評(píng)分算法 求指導(dǎo)
多選題一題3分
原則是:少選給2分,多選不給分,選錯(cuò)不給分
假如:正確答案123
提交答案 123 得3分
提交答案 12,13,23,都可得2分
提交答案 1234,234,134,124 沒(méi)分
怎么實(shí)現(xiàn),還是有更好的方法
------解決方案--------------------
按你的描述,你的多選題不是用 checkbox 而是用 text 輸入的
并且備選答案不會(huì)多于9個(gè)
于是得分可寫(xiě)作
count(array_intersect(str_split($正確答案), str_split($提交答案));
就是:分別切割成數(shù)組,然后取交集
------解決方案--------------------
如果你是使用 checkbox
那么提交后得到的就是數(shù)組,與正確答案數(shù)組取交集就是了
------解決方案--------------------
$正確答案 = array(1, 2, 3);
$提交答案 = array(1, 2);
$得分 = count(array_intersect($正確答案, $提交答案));
echo $得分; //2
------解決方案--------------------
引用:$正確答案 = array(1, 2, 3);
$提交答案 = array(1, 2);
$得分 = count(array_intersect($正確答案, $提交答案));
echo $得分; //2
取交集和樓主的題目要求不符合吧,比如提交答案為數(shù)組array(1,2,4),那么交集也是(1,2),實(shí)際應(yīng)該得0分吧。
------解決方案--------------------
是的,不完全符合。
但是選 1,2,4 就不得分是不合常理的。除非 4 是反選項(xiàng),比如:都不是
如果是這樣的話,出題者就是在有意誤導(dǎo)答題者
如果非要這樣出題的話,可以這樣寫(xiě)$正確答案 = array(1, 2, 3);
$錯(cuò)誤答案 = array(4);
$提交答案 = array(1, 2, 4);
$得分 = array_intersect($錯(cuò)誤答案, $提交答案) ? 0 : count(array_intersect($正確答案, $提交答案));
echo $得分; //0
引用:引用:$正確答案 = array(1, 2, 3);
$提交答案 = array(1, 2);
$得分 = count(array_intersect($正確答案, $提交答案));
echo $得分; //2
取交集和樓主的題目要求不符合吧,比如提交答案為數(shù)組array(1,2,4),那么交集也是(1,2),實(shí)際應(yīng)該得0分吧。
……
------解決方案--------------------
交并差就可以了
答卷在前,答案在后
有差集,不給分
無(wú)交集,不給分(排除上一個(gè)后這個(gè)是考慮空白答卷的情況,如果確認(rèn)不會(huì)有白卷這句可以不用)
無(wú)差集,有交集,交集數(shù)量!=答卷,半分
無(wú)差集,有交集,交集數(shù)量=答卷,滿分(這個(gè)可以不寫(xiě)邏輯,直接用else也行,因?yàn)榕懦厦鎺追N情況剩下就是交集相等)
注意
1.上面要順序判斷,是 else if 不相容邏輯而不是 switch 可容邏輯,因?yàn)槭×艘恍┡袛鄺l件
2.答卷和答案都要確保無(wú)重復(fù)值,不然交集數(shù)量判斷會(huì)有問(wèn)題
------解決方案--------------------
可以用位運(yùn)算來(lái)計(jì)算
A:1 B:2 C:4 D:8
如何選擇AB 則為3
如何選擇ABCD 則為15
比如正確為4 則 看看選擇的結(jié)果為N跟4比
if(N==4) 3分
if 4&N==N 2分
其他 O分
------解決方案--------------------
引用:可以用位運(yùn)算來(lái)計(jì)算
A:1 B:2 C:4 D:8
如何選擇AB 則為3
如何選擇ABCD 則為15
比如正確為4 則 看看選擇的結(jié)果為N跟4比
if(N==4) 3分
if 4&N==N 2分
其他 O分
位運(yùn)算是不錯(cuò)的選擇,選擇肢<32個(gè)(因系統(tǒng)和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 的補(bǔ)充不符
既然是用 checkbox 提交的,提交答案就不會(huì)是 array( [0] => 12 ) 形式
而是 array( [控件名] => array( [0] => 1 [2] => 2) ) 這種形式
否則是需要拆分成數(shù)組后才能使用數(shù)組函數(shù)的
------解決方案--------------------
貼出你的表單片段,我給你詳細(xì)解釋
------解決方案--------------------
對(duì)呀,你的 name="answer66[]"
所以提交后(假定全部選中) $_POST['answer66'] 是 array(1, 2, 3, 4) 這樣的數(shù)組
此時(shí)你同樣需要把答案處理成 array(1, 2, 3) 這樣的數(shù)組,才能應(yīng)用數(shù)組函數(shù)
對(duì)于這一點(diǎn),我 #1 的回復(fù)已經(jīng)說(shuō)了
------解決方案--------------------
function fen($a,$b){ //$a答案 $b正確答案
if($a==$b){
return 3;
}
foreach ($a as $value){
if(!in_array($value, $b)){
return 0;
}
}
return 2;
}
只想到個(gè)笨方法
------解決方案--------------------
多選和少選都不給分
就用差集為空
本條技術(shù)文章來(lái)源于互聯(lián)網(wǎng),如果無(wú)意侵犯您的權(quán)益請(qǐng)點(diǎn)擊此處反饋版權(quán)投訴
本文系統(tǒng)來(lái)源:php中文網(wǎng)
總結(jié)
以上是生活随笔為你收集整理的PHP多选题怎么弄,php多选题评分算法求指导解决方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php检测http状态码,php回来HT
- 下一篇: php ci ajax用户登录,使用jQ