【问题标题】:How can I convert an array into a php statement?如何将数组转换为 php 语句?
【发布时间】:2019-01-04 00:32:21
【问题描述】:

我有一个这样的数组...

[Summary] => Array
             (
                 [0] => yearManufactured
                 [1] => &&
                 [2] => make
                 [3] => ||
                 [4] => model
             )

我怎样才能把这个数组转换成函数调用和操作符,然后用它来做一个比较,比如把它变成这个...

if( $this->yearManufactured() && $this->make() || $this->model() ) {
     // do something
} else {
     // do something else
}

类中的方法..

public function yearManufactured() {
     return true;
}

public function make() {
     return false;
}

public function model() {
     return true;
}

【问题讨论】:

  • 有趣,您是否需要一种方法来确定它是否应该被解释为 (a && b) || c 而不是 a && (b || c)
  • 是的,我还没有做到这一点,但我需要修改一些东西,我可以很容易地将“(”和“)”添加为另一个单独的数组值。跨度>
  • 所有方法名称都已检查是否存在。我在想这样的事情:将数组内爆成一个字符串,粘合为“”,然后用 $this->$methodName() 替换所有非字母数字单词。我不确定这个字符串是否一旦创建,是否可以转换和使用。

标签: php methods comparison operators function-call


【解决方案1】:

这似乎是 eval 的有效用途。您可以验证每个数组项是运算符还是有效的方法名称,并将方法调用的结果转换为布尔字符串。将这些东西放在一起应该会产生一个字符串,您可以安全地进行评估,而不必担心它会做一些讨厌的事情,而不是可能导致解析错误,这可以在 PHP 7 中捕获。

如果您在数组中发现不应该存在的任何内容,或者表达式未解析,您可以返回 null 或抛出异常,但您想处理它。

public function evaluateExpressionArray(array $expression) {

    // build the expression
    $expr = '$result =';
    foreach ($expression as $part) {
        if ($part == '||' || $part == '&&') {
            $expr .= " $part ";
        } elseif (method_exists($this, $part)) {
            $expr .= $this->$part() ? 'true' : 'false';
        } else {
            return null;
        }
    }

    // try to evaluate it
    try {
        eval("$expr;");
    } catch (ParseError $e) {
        return null;
    }

    return $result;
}

不过,使用 eval 时要非常小心。除非您确切地知道它是什么,否则永远不要往里面放任何东西。

Here's an example to mess with.

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多