1

PHP新手在这里。我搜索了这个,但我确定我没有使用正确的语法来解决我的问题。抱歉,如果这是重复的:

我有这三个变量:

$param = get_sub_field('custom_parameter');
$compare = get_sub_field('parameter_compare');
$param_val = get_sub_field('parameter_value');

每个人都会返回这个:

$param is 'my_parameter'
$compare is either '==', '<=', or '=>'
$param_val is something like '5' or any value that the user sets

我拥有的是一个编辑界面,用户可以在其中设置参数名称,设置比较然后添加值。为此,他们还可以添加在参数匹配时发生的操作。我将它与 $_GET 结合使用。

我想做的是将上面的每个变量插入到我的 if 语句中,以便用户创建比较。但是,当我尝试这样做时,它一直给我一个错误:

if($_GET[$param] $compare $param_val) {
// do something
}

我得到的错误是:

解析错误:语法错误,意外的 T_VARIABLE

这当然工作得很好:

if($_GET[$param] == $param_val) {
// do something
}

希望我已经解释得很好,非常感谢任何帮助。

更新:感谢您为我回答这个问题并这么快就开始了。在这里学到了很多!

4

5 回答 5

4
function comparer($param, $compare, $param_val)
{
  switch ($compare){
    case '==': return $param == $param_val;
    case '!=': return $param != $param_val;
    case '<=': return $param <= $param_val;
    case '>=': return $param >= $param_val;
    case '<':  return $param <  $param_val;
    case '>':  return $param >  $param_val;
    default: return FALSE;
  }
}

/* ... */

if (comparer($param, $compare, $param_val)){
  // true
}

非常简单的方法让你开始。我会不惜一切代价抵制使用的诱惑eval,除非您想投入大量时间来清理这三个参数。

哦,还有一个例子

于 2013-07-26T15:31:03.610 回答
1

看着eval()

http://php.net/manual/en/function.eval.php

有了这个,您可以解析您格式化为字符串的代码。

于 2013-07-26T15:30:43.153 回答
1

我想我会使用 switch 语句来避免任何可怕的 eval 代码。

如:

switch($compare) {
    case '==':
        if($_GET[$param] == $param_val) {
            // do something
        }
    break;
    case '<=':
        if($_GET[$param] <= $param_val) {
            // do something
        }
    break;
    case '>=':
        if($_GET[$param] <= $param_val) {
            // do something
        }
    break;
}
于 2013-07-26T15:31:26.360 回答
1

最好的方法是为此创建一个函数。让该函数使用 aswitch来确定运算符,然后返回比较。

function compare($a, $b, $operator){
    $ret = NULL;
    switch($operator){
        case '==':
            $ret = $a == $b;
            break;
        case '>=':
            $ret = $a >= $b;
            break;
        case '<=':
            $ret = $a <= $b;
            break;
    }
    return $ret
}

然后只需简单地调用它:

if(compare($_GET[$param], $param_val, $compare)){
    // do something
}
于 2013-07-26T15:31:46.243 回答
0

嗯很有趣,我想我会这样处理它(未经测试):

function comparison($param, $compare, $param_val) {
    if ($compare == '==') {
        if ($param == $param_val) {
            return true
        }
    }
    if ($compare == '<=') {
        if ($param <= $param_val) {
            return true
        }
    }
    if ($compare == '>=') {
        if ($param >= $param_val) {
            return true
        }
    }
}

效率不高或干燥,可能会使用开关,因为这可能会更好,但这是我脑海中第一件事。

用法

if (comparison($param, $compare, $param_val)) {
    echo 'it's true';
} else {
    echo 'it's false';
}  

编辑

像往常一样,我被更好的代码打败了:)

PS我不确定你为什么有$param然后使用$_GET[$param]所以我只是$param在我的答案中使用过。

于 2013-07-26T15:35:37.113 回答