获得答案结果的更好方法

时间:2015-04-26 00:39:27

标签: php

我有多个问题可以与一起回答:

  
      
  1. 问题1:是否
  2.   
  3. 问题2:是否
  4.   
  5. 问题3:是否
  6.   
  7. 问题4:是否
  8.   
  9. 问题5:是否
  10.   
  11. 问题6:是否
  12.   

我需要得到“是”答案组合的结果,我所做的就是传统的,如果不这样的话;

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}}

这是一个好方法吗?还是有更好的?

1 个答案:

答案 0 :(得分:0)

这非常棘手!

我有一些经验,经过3次。想出一个解决方案。我认为你想要建立的是一个“推荐引擎”。您提出几个问题并提供答案,很可能是一个建议。

你可能有37个问题,但我怀疑你或你的客户有大约20个答案,我敢打赌他们热衷于改变它们!或者能够看到答案是什么。

我要解决的问题是创建一个“逻辑文件”,其中每一行都经过评估,以匹配哪个答案为是或否。

所以我们说你有37个问题 如果Question1为YES,则允许在下面的代码中使用Q1 = true。

所以让我们建立一个列表。我们的代码将遍历每一行,尝试从上到下找到匹配项。一旦找到匹配,它就会停止寻找更多匹配。

  1. 诀窍是把最复杂的比赛放在最上面。
  2. 将最简单的匹配放在底部。
  3. 确保您有“catchall matches”,这样就无法在没有匹配的情况下找到文件的末尾。
  4. 每行代码都指向您的答案。答案可能是网页,文本,解决方案的一些索引,但我们只需将其称为A1
  5. 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,这样你就可以阅读你的条件和答案。

    祝你好运。