我的功能有问题,应该根据数组中的数据组合逻辑运算符:
$arr = array(
0 => array(false, "or"),
1 => array(false, "or"),
2 => array(true)
);
等式应该是:
结果:是真的
但是函数中发生了错误,它返回false。 我错过了什么?
var_dump( arrayBoolValidation($arr) );
function arrayBoolValidation (array $arr) {
$num = count($arr);
$status = $arr[0][0];
for($i = 1; $i < $num; ++$i) {
if ($arr[$i-1][1] == "and") {
$status = filter_var($status, FILTER_VALIDATE_BOOLEAN) and filter_var($arr[$i][0], FILTER_VALIDATE_BOOLEAN);
} else if ($arr[$i-1][1] == "or") {
$status = filter_var($status, FILTER_VALIDATE_BOOLEAN) or filter_var($arr[$i][0], FILTER_VALIDATE_BOOLEAN);
}
}
return $status;
}
答案 0 :(得分:2)
这是运营商优先问题。 and
与&&
不同。看http://php.net/manual/en/language.operators.precedence.php
=
的优先级高于and
,因此$a = $b and $c;
等于$a = $b;
。
您必须使用额外的括号($a = ($b and $c);
)或更好地使用&&
。关于or
(使用||
)。
答案 1 :(得分:0)
假设必须评估所有条件:
注意:我没有定义运算符时添加了大小写。
[...]
if (!isset($arr[$i-1][1])) {
$status = $status || $arr[$i][0]; // default: OR, && else
} else if ($arr[$i-1][1] == "and") {
$status = $status && $arr[$i][0];
} else if ($arr[$i-1][1] == "or") {
$status = $status || $arr[$i][0];
}
[...]
答案 2 :(得分:0)
更改循环内的以下内容:
if ($arr[$i-1][1] == "and") {
$status = (filter_var($status, FILTER_VALIDATE_BOOLEAN) and filter_var($arr[$i][0], FILTER_VALIDATE_BOOLEAN));
} else if ($arr[$i-1][1] == "or") {
$status = (filter_var($status, FILTER_VALIDATE_BOOLEAN) or filter_var($arr[$i][0], FILTER_VALIDATE_BOOLEAN));
}
你会看到额外的括号。
如果你没有放置它们,你将$ status设置为filter_var($ status,FILTER_VALIDATE_BOOLEAN),它将始终与第一个条目相同(在这种情况下为false)。
答案 3 :(得分:-1)
我认为循环中存在错误
试,
for($i = 1; $i <=$num; ++$i) {