Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用数组(或xml)编写函数_Php_Xml - Fatal编程技术网

Php 使用数组(或xml)编写函数

Php 使用数组(或xml)编写函数,php,xml,Php,Xml,最终目标 就是做一些像Magento提供的东西——基本上是一个逻辑构建器,正如Stackoverflow上的这篇文章所示:到目前为止,我已经用jQuery构建了一个树,并获取了我希望构建器使用、检查和设置的数据。现在我只需要解析检查并将其添加到我正在制作的脚本中的各个位置,但我不确定如何动态处理它,以便可以执行这些检查,这将导致一些操作发生/数据自动更改 也许我们可以称之为动态表达式处理 原职 原谅我,我知道我想做什么,但不知道怎么做-所以我在寻找一些灵感。我已经允许生成一个多维数组,该数组将包

最终目标

就是做一些像Magento提供的东西——基本上是一个逻辑构建器,正如Stackoverflow上的这篇文章所示:到目前为止,我已经用jQuery构建了一个树,并获取了我希望构建器使用、检查和设置的数据。现在我只需要解析检查并将其添加到我正在制作的脚本中的各个位置,但我不确定如何动态处理它,以便可以执行这些检查,这将导致一些操作发生/数据自动更改

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

原职

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

在它最基本的形式中,数组将包含一组if语句,其中如果该语句为true,那么将进入下一个数组项并向下移动一个级别,如果为false,那么将进入下一个没有子项的数组项,我想我们可以称之为未婚兄弟。一旦没有什么需要处理,因为没有什么是真实的,那么就什么也不会发生

我认为最好的“输入”数据的方式可能是通过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');
因此,上面的是-如果day=3,那么将date_day设置为星期三;否则,如果day=4,则将date\u 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>
我知道可以使用date函数完成上述操作,但这是一个非常基本的示例。另一个例子可能涉及检查输入的颜色是否为红色,如果为红色,则根据此颜色设置某个颜色,如果为蓝色,则执行其他操作。另一种方法是,如果点击美国国旗,将模板设置为针对美国访客。关键是它基本上可以完成任何操作,进行检查并给出结果——基本上就像编程一样——但是函数数据是通过PHP或XML输入的

我确信一定有什么东西可以做到这一点,但我只是不知道应该从哪里开始,所以任何帮助都会很好-是的,我知道可能存在一些安全问题,但我计划进行检查,检查检查检查、条件、值,etc是安全的,因此需要考虑到这一点


非常感谢

好吧,撇开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;
    }
}

您的问题与表单验证非常相似,因此我将研究一些流行的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种,一种是狗粮,一种是猫粮,一种是鱼粮。可能会有更多的重复,但它比完整的解析器更容易实现


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

您在这里想要完成什么?你把事情弄得太复杂了。。嗯,我想你要找的是数组映射函数?我不确定您想做什么…基本上允许执行没有硬编码的检查,可以说,这些检查可以以数组/XML的形式生成。我知道这听起来有点复杂,但基本上只需要读取数组或xml,并根据其内容执行操作/检查。啊哈,我认为你的方向是正确的。我可以说的是,你需要使用数组映射,这将对你有很大帮助。因此,不要使用循环。您只需完成函数+数组值或xml文件的实现。。然后使用array_map.加载带有函数的数组。听起来像是在尝试创建一个运行时或编译器,它可以在标记化指令上工作。基本上,任何编程语言在解析源代码后都会做些什么。也许你应该读一些关于这个方向的书。@MrJ:那么set函数检查什么呢?无论如何,如果你
你需要用PHP阅读XML文档,有多个扩展。PHP文档应该告诉您需要知道的内容。如果存储空间/传输速度不是问题,我会避免使用JSON来处理那些需要人工编辑的配置文件。是的,我同意。这篇文章已经被编辑了多次,我不能留下评论,但我首先回应的是修复数组结构,然后将其编辑为正确的,我想解决这个问题,即XML是最好的编程方式。显然,他是通过JS接口以编程方式生成代码的,所以它可能不需要是人类编辑的。所以JSON在这里可能是正确的选择。@Ally对编辑感到抱歉。生成数组/xml后,需要保存数组/xml,以便在配置页面外进行处理,并在需要时通过界面(而不是直接在文本编辑器中)进行编辑。谢谢-我发现这是我需要的基础感谢保持所有内容一致的想法和模板,我现在已经实现了您概述的内容
$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
    )
  )
);