Как я могу преобразовать массив в оператор 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;
}

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, хоть. Никогда ничего не вкладывайте в это, если вы точно не знаете, что это такое.

Вот пример, с которым можно связываться.

Другие вопросы по тегам