首页 > 解决方案 > 如何将数组转换为 php 语句?

问题描述

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

[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;
}

标签: phpmethodscomparisonoperatorsfunction-call

解决方案


这似乎实际上可以有效地用于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。除非您确切地知道它是什么,否则永远不要将任何东西放入其中。

这是一个要搞砸的例子。


推荐阅读