2012-01-28 78 views
1

终极目标使用数组(或XML)编程功能

就是让类似的Magento提供 - 基本逻辑建设者,和#2所示的这个帖子:jQuery (or any web tool) Nested Expression Builder到目前为止,我已经做jQuery构建树并获取我希望构建器使用,检查和设置的数据。现在我只需要解析这些检查并将其添加到我正在编写的脚本的各个位置 - 但我不确定如何动态处理它,以便执行这些检查,这将导致发生某些操作/数据发生更改自动。

也许我们可以称之为动态表达式处理?

原贴

原谅我,我知道我想干什么,但根本不知道该怎么办呢 - 所以我在寻找一些灵感。我已经允许生成一个多维数组,并且该数组将包含某些'命令'和逻辑函数,并且当条件为真时,它将被执行。

这是最基本的形式,该数组将包含一组if语句,如果该语句为真,那么会进入下一个数组项,然后下一个级别,如果它是假的, d进入没有孩子的下一个数组项目(未婚兄弟姐妹,我想我们可以称之为)。一旦没有什么可以处理的,因为没有什么是真的,那么什么都不会发生。

我想可能是通过XML提供数据的最佳方式 - 尽管如此,我可能会继续深入下去,否则就会下降,直到出现真实情况?

基本上,数组采用以下形式(虽然我不是100%肯定,我编写正确,但我认为它看起来右:S):

[0][0] => array('function' => 'if', 'check' => 'day', 'condition' => 'equals', 'value' => '3'); 
[0][1][0] => array('function' => 'set', 'name' => 'date_day', 'value' => 'wednesday'); 
[1][0] => array('function' => 'if', 'check' => 'day', 'condition' => 'equals', 'value' => '4'); 
[1][1][0] => array('function' => 'set', 'name' => 'date_day', 'value' => 'thursday'); 

所以上面会 - 如果日= 3,然后将date_day设置为星期三;否则,如果天= 4,则设置date_day周四

这我想像将对应于(虽然我不知道,如果你能分项):

<items> 
    <item> 
     <function>if</function> 
     <check>day</check> 
     <condition>equals</condition> 
     <value>3</value> 
     <item> 
      <function>set</function> 
      <name>date_day</name> 
      <value>wednesday</value> 
     </item> 
    </item> 
    <item> 
     <function>if</function> 
     <check>day</check> 
     <condition>equals</condition> 
     <value>4</value> 
     <item> 
      <function>set</function> 
      <name>date_day</name> 
      <value>thursday</value> 
     </item> 
    </item> 
</items> 

它们基本上将作出以下声明在某种类型的功能:

function ($current_data){ 
    LOOP 
    if(FUNCTION == "if"){ 
     if(CHECK CONDITION VALUE){ 
     **go to next item deeper in the chain** 
     } else { 
     **go to sibling item** 
     } 
    } else if(FUNCTION == "set"){ 
     define(NAME, VALUE); 
    } 
    ENDLOOP 
} 

我知道上面可以使用date()函数来完成,但是这是一个非常简单的例子。另一个例子可能涉及检查输入的颜色是否是红色,如果是,则根据此颜色设置一些颜色,如果颜色是蓝色,则可以执行其他操作。另一个可能是将该模板设置为美国访问者,如果美国国旗被点击。重点是它可以基本上完​​成任何操作并进行检查并给出结果 - 基本上就像编程 - 但函数数据由PHP或XML提供的地方

我确定必须有一些东西在那里可以做到这一点,但我不知道要开始准确,所以任何援助将是伟大的 - 是的,我知道可能有一些安全问题,但我打算检查,检查checks,conditions,values,等等是安全的(所以这需要能够被考虑进去)。

很多很多谢谢!

+2

什么是你想在这里完成的?你让自己的方式太复杂了..嗯,我认为你在找什么是array_map函数?我不知道什么是你试图做...要执行 – SolidSnake 2012-01-28 23:54:38

+0

基本上允许检查未硬编码,可以这么说,但可以在一个阵列/ XML的形式产生。我知道这听起来有点复杂 - 但基本上只需要读取数组或xml并根据其内容执行操作/检查。 – MrJ 2012-01-28 23:57:39

+0

啊哈我认为你是在正确的方向上,我只能说你需要使用array_map,这对你有很大的帮助。所以不要使用循环。你只是完成实现你的(功能+您的数组值或XML文件)..然后使用array_map加载与功能的阵列.. – SolidSnake 2012-01-29 00:09:52

回答

0

好了JSON与XML之外,这里的我会怎样处理该阵列...

$array = xmldecode($xml); 
$resultFound = false; 
$i = 0; 

while(!$resultFound && $i < count($array)) { 
    if (myFunction($array[$i]) { 
     $resultFound = true; 
    } 
    $i++; 
} 

if (!$resultFound) { 
    // error condition 
} 

function myFunction($array) { 
    $function = $array[0]['function']; 

    switch($function) { 
     case 'if': 
      $checkVariable = $array[0]['check']; 
      $condition = $array[0]['condition']; 
      $checkValue = $array[0]['value']; 
      switch($checkVariable) 
       case 'day': 
        switch($condition) { 
         case 'equals': 
          if (GLOBAL_DAY == $checkValue) { 
           return myFunction($array[1]); 
          } else { 
           return false; 
          } 
          break; 
         case 'less than': 
          if (GLOBAL_DAY < $checkValue) { 
           return myFunction($array[1]); 
          } else { 
           return false; 
          } 
          break; 
        } 
       break; 
      } 
     break;  
     case 'set': 
      $setVariable = $array[0]['name']; 
      $setValue = $array[0]['value']; 
      switch($setVariable) { 
       case 'date_day': 
        GLOBAL_DATE_DAY = $setValue; 
        return true; 
        break; 
      } 
     break; 
    } 
} 
+0

如果存储空间/传输速度不是问题,我会避免使用JSON来配置可以人为编辑的配置文件。 – 2012-01-29 00:27:06

+1

是的,我同意。这篇文章已经多次编辑,我不能留下评论,但我首先回应修复了数组结构,然后编辑了正确的数据结构,并且我想解决这个问题的观点,即XML是最好的编程方式。 – Ally 2012-01-29 00:32:21

+0

那么,显然他的编程生成的代码通过JS接口,所以它可能并不需要是人编辑。所以JSON在这里可能是正确的选择。 – 2012-01-29 00:37:16

0

你的问题是非常相似的表单验证的,所以我会看一些流行的jQuery表单验证插件或像CakePHP这样的MVC框架。这些通常都具有用于最常见的验证规则的库存构建块,用户可以容易地将它们放在一起并传递特定参数以涵盖大多数场景。

您的问题,这些例子之间的显着区别是,表单验证框架是面向开发人员,这样他们就可以简单地编写自定义的功能,如果他们需要胶水多个规则在一起,形成更复杂的规则。但是,你仍然可以实现的东西,通过做这样的事情对于所有用例大概98%的工作原理:

$offers = array(
    'pet feed sale' => array(
    'category' => array(1, 2, 3) 
    'total' => '>100', 
    'weekday' => array('mon', 'wed') 
    'set' => array(
     'discount' => 80 
     'shipping' => 0 
    ) 
), 
    'medication sale' => array(
    'category' => 4 
    'date' => '2012-1-28', 
    'set' => array(
     'discount' => 50 
    ) 
) 
); 

而且,如果用户需要应用更复杂的定价结构,那么他们可以,例如,打破了“宠物饲料销售“规则分为3个优惠,一个用于狗粮,一个用于猫粮,另一个用于鱼类食品。可能会有更多的重复,但它比完整的解析器更容易实现。

而且,大多数非程序员可能处理重复了很多比复杂的逻辑和控制流更好。

+0

感谢让所有内容保持一致的想法和模板,我现在已经实现了您所概述的内容 – MrJ 2012-01-29 19:35:25