php - 如何将数组转换为 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;
}
解决方案
这似乎实际上可以有效地用于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
。除非您确切地知道它是什么,否则永远不要将任何东西放入其中。
推荐阅读
- javascript - 在 Chrome 浏览器的 React 中使用时,自动完成功能不起作用
- javascript - 求和和计数 D3.js
- android - 失败的 sepolicy 检查 - Android Pie 构建 - “core_data_file_type”属性
- javascript - 发布 CSS 不转换自定义属性
- php - 需要返回与 api 资源的关系
- jquery - 按钮点击动画marginTop
- java - 将经度和纬度传递给java类
- c# - 在 Web api 中使用 FormUrlEncoded 或 Json 发布数据
- c# - C# 卡在 db call 甚至 oracle 在大约 30 分钟后自动清除会话
- php - 更改 pchart 分隔符