如何在php中将字符串转换为布尔值

时间:2011-09-16 12:09:52

标签: php cakephp-1.3

我在php中定义了这个函数

function ifstatement($statement = 'if(10 > 9;1+1;2+2)') {
// $statement = str_replace(' ', '', $statement);

if (strpos($statement, 'if(') > -1) {
   $statement = rtrim(ltrim(str_replace(' ', '', $statement), 'if('), ')');
   $exp = explode(';', $statement);
  if ( $exp[0] ) {
    if (strpos($exp[1], 'if(' )> -1) {
     return ifstatement($exp[1]);
    } else {
     return 1;
   }
  } else {
  if (strpos($exp[2], 'if(')> -1) {
    return ifstatement($exp[2]);
  } else {
   return 0;
  }
 }
}else{
  echo 'out';
  }
}

问题是函数总是返回1,即使函数参数中if语句中的条件为false,也是用

测试的
if($exp[0])

看起来$exp[0]看起来像一个字符串,我怎么能把它作为参数进行测试

3 个答案:

答案 0 :(得分:2)

$exp[0]包含10 > 9(无论您在第一次;之前拥有什么),所以只有它是空字符串或'0'才会评估为false。要正确评估这一点,您应该使用eval()函数:

$condition = '10 > 9';
$result = eval('return ' . $condition . ';');
  

注意:请勿在生产环境中使用eval(),除非您确实确保您的输入无害并且您无法以其他方式执行此操作。

答案 1 :(得分:0)

$exp[0] = (boolean) $exp[0];

可能是您正在寻找的东西

答案 2 :(得分:0)

除非您打算正确地执行此操作(使用解析器),否则最好让用户在多个字段中指定其条件。一行将包含x的文本字段,比较运算符的选择字段(==<>)以及y的另一个文本字段。然后他们可以指定是否匹配所有支票或任何支票。当它们像这样被打破时,您将能够执行预期的逻辑,而无需使用strposeval来实现新语言,这完全是疯狂。

您可以在Thunderbird的消息过滤器编辑中看到此类接口的示例:

enter image description here

并在iTune的智能播放列表编辑中:

enter image description here