我的函数有问题,它应该根据数组中的数据组合逻辑运算符:
$arr = array(
0 => array(false, "or"),
1 => array(false, "or"),
2 => array(true)
);
等式应为:
- 假或假或真
- ($arr[0][0] $arr[0][1] $arr[1][0] $arr[1][1] $arr[2][0])
结果:真
但是函数中发生了错误,它返回 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;
}
这是一个运算符优先级问题。 and
与&&
不同。看看 http://php.net/manual/en/language.operators.precedence.php
=
的优先级高于and
,所以$a = $b and $c;
等于$a = $b;
。
您必须使用额外的括号 ( $a = ($b and $c);
) 或更好地使用 &&
。关于or
也是如此(使用 ||
)。
假设必须评估所有条件:
注意:我添加了未定义运算符的情况。
[...]
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];
}
[...]
在循环中更改以下内容:
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)。
我认为循环中有问题
尝试
for($i = 1; $i <=$num; ++$i) {