将数组视为一组通用或抽象条件语句:
$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
}
答案 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';
变量$a
到$f
可以作为单个数组传递,但我想展示其灵活性。
你当然可以使用eval
,但坦率地说,这将是Fugly (大写字母F)!这种方法更加健壮,可以说是解决问题的正确方法。我也认为这很漂亮,但这是主观的:) - 我不确定它会如何影响性能。
您应该查看call_user_func
和call_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
}
如果所有条件都为真,则计数应该在预过滤和后过滤的数组之间匹配。