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

时间:2014-01-02 23:00:36

标签: php arrays if-statement functional-programming conditional-statements

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

$conditionSet = array(
    'condition1' => '$a > $b', 
    'condition2' => '$c != $d', 
    'condition3' => '$f < $e'
);

是否可以将我当前执行范围内的变量应用于数组中的条件,而无需尝试解析语句?的

$a = 1; 
$b = 2; 
$c = 3; 
$d = 4;
$e = 5; 
$f = 6; 

if ( $conditionSet['condition1'] && 
     $conditionSet['condition2'] && 
     $conditionSet['condition3'] )
{
    // PASS: do something    
} else {        
    // FAIL: do something else
}

3 个答案:

答案 0 :(得分:1)

你想使用array_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';
}

答案 1 :(得分:1)

我想我知道你得到了什么 - 这里的其他答案假设你的$conditionSet是预定布尔值的集合,这是完全合理的,但你的编辑暗示你想要能够断言 n 在任何给定时间,参数数量与给定的一组通用检查相匹配?

您可以将 “函数(断言)。虽然在这个例子中它可能不严格遵守它,但我认为这部分地形成了functional programming方法的基础。

function assertion(){
    $args = func_get_args();
    foreach($args[0] as $assert)
        if(!call_user_func_array($assert, array_slice($args, 1)))
            return false;
    return true;
}

$conditionSet = [
    function($a, $b){ return $a > $b; },
    function($a, $b, $c, $d){ return $c != $d; },
    function($a, $b, $c, $d, $e, $f){ return $f < $e; }
];

if( assertion($conditionSet, 2, 1, 3, 4, 6, 5) )
    echo 'All conditions true';
else 
    echo 'One or more conditions false';

demo

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


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

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


以下只是为了完整性,不应在生产代码中使用...

我应该也指出 PHP 有它自己的assert函数,它接受可调用的参数(诚然,我自己甚至都没有意识到这一点)但它不接受一组几个。无论如何,这是一个简单的演示:

$a = 2; $b = 3;
if( assert(function($a, $b){ $a > $b; }) )
    echo '$a is greater than $b';

如果您最终没有阅读assert文档,请注意其中有一部分内容为:

  

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

我不确定这是否指的是一个适用于整个函数的选项,或者只是它能够评估字符串(很可能是前者) - 这是我猜的工作与eval类似。

why eval is evil上查看此帖子。

100%不清楚你的最终目的是什么,为了简单比较,这有点过分,但是如果你处理更复杂的逻辑,我可以看到我发布的第一个解决方案的用途。

答案 2 :(得分:0)

在没有回调函数的情况下使用时,Array array_filter函数将过滤掉所有false表达式:

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

如果所有条件都为真,则计数应该在预过滤和后过滤的数组之间匹配。