[英]Better approach to get result of answers
我有多個問題可以回答是或否,例如:
- 問題1:是否
- 問題2:是否
- 問題3:是否
- 問題4:是否
- 問題5:是否
- 問題6:是否
我需要得到“是”答案的組合結果,如果不是這樣的話,我所做的就是傳統方法;
if($_POST[q1] && $_POST[q2] && $_POST[q5]){
echo 'something';
}elseif($_POST[q3] && $_POST[q5]){
echo 'something again';
}elseif($_POST[q3] && $_POST[q5]){
echo 'something again again';
}
and so on...
盡管它是正確的,但由於存在許多問題和可能的組合,它仍然會產生數百行代碼。
有沒有更好的方法? 伙計們
編輯:
抱歉,第二個問題是copy> paste haha,反正...有37個問題,並且有很多組合,例如1和2是,然后執行此操作...但是,如果2和3和4是,請執行此操作...我不需要所有組合。
我讀過某個地方,您可以使用2,4,8,16,32,64,128等...(我不知道它們叫哈哈)來添加以獲得結果。 就像如果1&2是yes,那么結果將是6,因為2 + 4 = 6,或者如果4&6是yes,那么結果將是80,因為16 + 64 = 80 ...所以我可以這樣做
Question 1 = <input type=text value=2 name=que[] />
Question 2 = <input type=text value=4 name=que[] />
Question 3 = <input type=text value=8 name=que[] />
Question 4 = <input type=text value=16 name=que[] />
Question 5 = <input type=text value=32 name=que[] />
Question 6 = <input type=text value=64 name=que[] />
$array = (
6=>"1&2 are yes",
10=>"1&3 are yes",
80=>"4&6 are yes"
);
echo $array[array_sum($_POST[que])];
這是一個好方法嗎? 還是有更好的選擇?
我有一些經驗,經過3次。 提出解決方案。 我認為您正在嘗試構建的是“推薦引擎”。 您提出幾個問題並提供答案,最有可能是建議。
您可能有37個問題,但我懷疑您或您的客戶有大約20個答案,我敢打賭他們渴望更改它們! 或者能夠看到答案是什么。
為了解決這個問題,我要做的是創建一個“邏輯文件”,在其中評估每行以匹配哪個答案是或否。
假設您有37個問題,如果Question1為YES,則在下面的代碼中使用Q1 = true。
因此,讓我們建立一個清單。 我們的代碼將遍歷每一行,以嘗試從上至下查找匹配項。 找到匹配項后,它將停止尋找更多匹配項。
So put the most tricky match at the top.
A10 | Q1 & Q2 & (Q3 OR Q4) # this means Q1=yes, Q2=yes, Q3=yes or Q4=yes
A9 | Q1 & Q2 & *Q3 # Use * to mean not Q3, eg Q3 must be false
A8 | Q1
A7 | Q2
A6 | *Q1
如果我回答Q1 =是,而所有其他問題都不是。 那么A8將是一場比賽。 如果Q1 =是,Q2 =是,所有其他否,則A9將為匹配項
您必須對邏輯引擎進行編碼,但是您已經開始理解它。 邏輯引擎將不得不解析您的自定義邏輯文件並使邏輯工作,但這並不難。 很有趣。
從OR'ing位開始,就像您難以理解的2,4,8,16那樣,是很難調試的。 我們在一開始就做到了。 糟透了...
然后,我們編寫了100個“ if”語句,但是現在您必須與旁邊的客戶坐下來,並嘗試提出邏輯。 無法正常工作,並且調試時間非常長。
這個邏輯文件很棒。 您可以輕松地看到數十億種組合,但是使用此基於文件的系統,您可以看到如何找到每種解決方案,必須滿足哪些組合。 如果不滿足這些要求,那么接下來應該評估哪個規則。
在這里快速測試。 有37是是沒有問題有2 ^(n-1)個解決方案= 68,719,476,736
因此,邏輯文件是分解想要捕獲的某些已知組合並查看它們已被捕獲的快速方法(例如,此邏輯文件中存在一行)。
這是我在Python中的邏輯引擎。
class LogicEngine(object):
def filterTags(self, rules, tags):
if(rules.strip()==""): return True # no tags means true.
# Bracket Logic, eg... *a & (b OR c)
openBracket = 0
closeBracket = 0
while(openBracket != -1):
openBracket = rules.find("(",openBracket)
closeBracket = rules.find(")",openBracket+1)
if(openBracket!=-1):
# found a rule, convert *a & (b OR c) to *a & TRUE, which can be then handled by logic system.
subRule = rules[openBracket+1:closeBracket]
if self.filterTags(subRule,tags):
rules = rules.replace("(" + subRule + ")", "TRUE")
#print rules
else:
rules = rules.replace("(" + subRule + ")", "FALSE")
#print rules
#print rules #quick check.
ruleList = rules.split("OR")
for rule in ruleList:
rule = rule.replace(" ","")
rule = rule.split("&")
if self.checkRule(rule, tags) : return True
return False #no matches found means this is not valid.
def checkRule(self, rules, tags):
for rule in rules:
if rule[0:1]=="*":
# a NOT rule.
rule = rule[1:] #remove star
if rule =="TRUE":
return False
if rule =="FALSE":
# do nothing, keep looping.
pass
elif (listContains(tags,rule)):
return False
else:
if rule =="FALSE":
return False
if rule =="TRUE":
# do nothign
pass
elif (not listContains(tags,rule)):
return False
return True
def listContains(list, key):
try:
list.index(key)
return True
except ValueError:
return False
簡而言之,您真的需要在這里做一些工作才能實現。 並不是那么簡單。
最糟糕的情況是您將$ _POST轉換為更具可讀性的內容。
然后在頂部運行最復雜的if語句的大列表。
例如
// Answer1.html,適合毛茸茸的人。 if($ Q1 && $ Q2 &&!$ Q3 ||($ Q6 && $ Q7)返回“ answer1.html”;
//對於有胡須的人使用Answer2.html if($ Q1 && $ Q2 && $ Q3)返回“ answer2.html”;
//如果是鼻毛的人,則為Answer3.html if($ Q1)返回“ answer3.html”;
//對於有腳趾發的人使用Answer4.html if(!$ Q1)返回“ answer4.html”;
我仍然要使這些陳述更具表現力。 代替$ Q1,將其設置為$ nosehair,以便您可以閱讀自己的條件和答案。
祝你好運。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.