PHP:解析含布尔与逻辑运算符的数组为条件表达式的最优方法(避eval)
不使用eval实现PHP布尔数组转条件判断
完全可行,而且能严格遵循PHP逻辑运算符的优先级(&&优先级高于||)计算结果,全程无需用到eval。最直接有效的方式是分两步处理:先计算所有&&运算,再处理剩余的||运算,具体实现如下:
实现思路
因为&&的优先级比||高,不能直接从左到右依次计算。我们需要先遍历数组,把所有&&对应的运算结果替换回数组;等所有&&处理完成后,再处理剩下的||运算,最终得到整个条件的布尔结果。
代码实现
function calculateBooleanCondition(array $conditionArr) { // 第一步:处理所有&&运算 $index = 1; while ($index < count($conditionArr)) { if ($conditionArr[$index] === '&&') { // 计算当前&&前后的布尔值 $calcResult = $conditionArr[$index - 1] && $conditionArr[$index + 1]; // 用结果替换掉「前值、&&、后值」这三个元素 array_splice($conditionArr, $index - 1, 3, $calcResult); // 重置索引,重新遍历数组(数组长度已改变) $index = 1; } else { $index += 2; } } // 第二步:处理所有||运算 $index = 1; while ($index < count($conditionArr)) { if ($conditionArr[$index] === '||') { $calcResult = $conditionArr[$index - 1] || $conditionArr[$index + 1]; array_splice($conditionArr, $index - 1, 3, $calcResult); $index = 1; } else { $index += 2; } } // 最终数组只剩一个布尔值,即整个条件的结果 return $conditionArr[0]; } // 测试示例数组 $booleans = [true, '||', false, '&&', true, '||', false]; $result = calculateBooleanCondition($booleans); // 用结果执行条件判断 if ($result) { // 执行操作 echo "条件成立"; } else { // 执行其他操作 echo "条件不成立"; }
方案优势
- 安全可靠:完全规避了
eval带来的代码注入风险; - 结果准确:严格按照PHP的运算符优先级计算,和直接写条件语句的结果一致;
- 高效直观:通过数组替换的方式处理运算,逻辑清晰,对于常规长度的数组效率足够。
内容的提问来源于stack exchange,提问作者Ood
相关产品推荐
相关产品推荐

