У меня есть такой массив …
[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;
}
Это похоже на то, что на самом деле может быть полезным для 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
, хоть. Никогда ничего не вкладывайте в это, если вы точно не знаете, что это такое.
Других решений пока нет …