我有多个问题可以与是或否一起回答:
- 问题1:是否
- 问题2:是否
- 问题3:是否
- 问题4:是否
- 问题5:是否
- 问题6:是否
醇>
我需要得到“是”答案组合的结果,我所做的就是传统的,如果不这样的话;
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])];
虽然它是正确的,它仍会产生数百行代码,因为有太多问题和可能的组合。
有更好的方法吗? Ty们..
修改
抱歉,第二个是复制&gt;粘贴哈哈,无论如何...有37个问题,有很多组合像 如果1和2是肯定的,那么这样做......但是如果2和3和4都是,那么这就是......我不需要每一个组合。
我在某处读到你可以使用2,4,8,16,32,64,128等...(我不知道它们叫做什么哈哈)来添加以获得结果。就像1&amp; 2是肯定的,那么结果将是6因为2 + 4 = 6,或者4&amp; 6是肯定然后结果将是80因为16 + 64 = 80 ...所以我可以这样做
{{1}}
这是一个好方法吗?还是有更好的?
答案 0 :(得分:0)
我有一些经验,经过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 = YES而所有其他问题都没有。 那么A8就是一场比赛。 如果Q1 = YES,则Q2 = YES所有其他否,则A9将是匹配
你必须编写逻辑引擎的代码,但你开始明白这个想法了。 逻辑引擎必须解析自定义逻辑文件并使逻辑工作,但这并不难。很有趣。
开始使用OR'ing位,就像你想要的2,4,8,16一样,FAR难以调试。我们在开始时做到了这一点。它糟透了......
然后我们写了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&amp;&amp; $ Q2&amp;&amp;!$ Q3 ||($ Q6&amp;&amp; $ Q7)返回“answer1.html”;
//有胡须的人的Answer2.html if($ Q1&amp;&amp; $ Q2&amp;&amp; $ Q3)返回“answer2.html”;
// Answer3.html适用于鼻毛的人 if($ Q1)返回“answer3.html”;
// Answer4.html适用于有头发的人 if(!$ Q1)返回“answer4.html”;
我仍然会使这些陈述更具表现力。 而不是$ Q1,让它成为$ nosehair,这样你就可以阅读你的条件和答案。
祝你好运。