PHP:如何将变量应用于一组动态条件?

PHP:如何将变量应用于一组动态条件?,php,arrays,if-statement,functional-programming,conditional-statements,Php,Arrays,If Statement,Functional Programming,Conditional Statements,将数组视为一组通用或抽象条件语句: $conditionSet=array( “条件1”=>“$a>$b”, “条件2”=>“$c!=$d”, “条件3”=>“$f$b;}, 函数($a,$b,$c,$d){返回$c!=$d;}, 函数($a、$b、$c、$d、$e、$f){return$f$b;})) 回声“$a大于$b”; 如果您最后没有阅读文档,请注意其中有一部分内容如下: “…应仅用作调试功能…不应用于输入参数检查等正常运行时操作。根据经验,如果未激活断言检查,则代码应始终能够正常工作

将数组视为一组通用或抽象条件语句:

$conditionSet=array(
“条件1”=>“$a>$b”,
“条件2”=>“$c!=$d”,
“条件3”=>“$f<$e”
);
是否可以将当前执行范围内的变量动态应用于数组中的条件,而无需尝试和解析语句

$a=1;
$b=2;
$c=3;
$d=4;
$e=5;
$f=6;
如果($conditionSet['condition1']&&
$conditionSet['condition2']&&
$conditionSet['condition3'])
{
//传球:做点什么
}否则{
//失败:做点别的
}

Array\u如果在没有回调函数的情况下使用,则过滤函数将过滤掉所有错误表达式:

if(count(array_filter($conditionSet)) == count($conditionSet)){
    //do somthing
}else{
    //do other
}

如果所有条件均为真,则预筛选数组和后筛选数组之间的计数应匹配。

要使用array\u reduce

$conditionSet = array(true, false, true);

$conditionReduced = array_reduce
(
    $conditionSet,
    function($a,$b)
    {
        return $a && $b;
    },
    true
);

if($conditionReduced)
{
    echo 'all conditions are true';
}
else
{
    echo 'one or more conditions are false';
}

我想我明白你的意思了-这里的其他答案假设你的
$conditionSet
是一组预先确定的布尔值,这是完全合理的,但是你的编辑表明你希望能够断言n在任何给定的时间,参数的数量与给定的一组通用检查匹配

您可以将可调用的比较函数(断言)分组,而不是将状态耦合到应用程序的特定部分。虽然在这个例子中它可能没有严格遵守它,但我相信这部分构成了一种方法的基础

函数断言(){
$args=func_get_args();
foreach($args[0]作为$assert)
如果(!call_user_func_array($assert,array\u slice($args,1)))
返回false;
返回true;
}
$conditionSet=[
函数($a,$b){return$a>$b;},
函数($a,$b,$c,$d){返回$c!=$d;},
函数($a、$b、$c、$d、$e、$f){return$f<$e;}
];
if(断言($conditionSet,2,1,3,4,6,5))
回显“所有条件均为真”;
其他的
回显“一个或多个条件为假”;

变量
$a
$f
可以作为单个数组传递,但我想展示一下灵活性


你当然可以使用
eval
,但坦率地说,那将是Fugly(大写F)!这种方法更稳健,可以说是解决问题的正确方法。我也认为它相当漂亮,但这是主观的:)-我不确定它会如何影响性能

您应该查看和上的文档,因为它们是非常强大的工具


以下内容仅用于完整性,不应在生产代码中使用…

我还应该指出,PHP有自己的
assert
函数,它接受可调用的参数(当然我自己也不知道),但它不接受几个参数的集合。无论如何,这里有一个简单的演示:

$a=2$b=3;
if(断言(函数($a,$b){$a>$b;}))
回声“$a大于$b”;
如果您最后没有阅读文档,请注意其中有一部分内容如下:

“…应仅用作调试功能…不应用于输入参数检查等正常运行时操作。根据经验,如果未激活断言检查,则代码应始终能够正常工作。”

我不确定这是指一个应用于函数整体的选项,还是指它计算字符串的能力(很可能是前者)——我猜它的工作方式与
eval
类似

请参阅上的这篇文章


现在还不是100%清楚你的最终意图是什么,对于简单的比较来说,这有点过分,但是如果你处理更复杂的逻辑,我可以看到我发布的第一个解决方案的用处

你的数组包含哪些布尔值?你说的是像..这样的数组吗<代码>数组(“1+1>5”、“真”、“0”、“10>2*3”)?是的,就像你说的。该数组类似于数组(“1+1>5”、“真”、“0”、“10>2*3”)@BigbetleFan我编辑了你的帖子,试图让你的要求更清楚——如果有任何你认为不准确的陈述,请你进一步修改。这是最好的方法,它还允许你在将来调整测试以处理其他逻辑或任何所需的转换(例如字符串比较)。