使用数字评估连续运算符

I'm struggling with a small piece of code that doesn't want to evaluate itself :

$t = 5;
$s = "<=";
$r = 6;

var_dump($t.$s.$r);

Here the var_dump return "5<=6" which make sense but I just want it to tell me if 5 is inferior or equal to 6 with a boolean.

I wanted to know if there was an other way to get this boolean beside using an eval() or a switch throught all the possible operator

Thanks in advance.

dongliao1948
dongliao1948 如果它总是xopy然后一个简单的开关是要做的事情,其他方法将是重大的过度杀伤。
接近 2 年之前 回复
dongpai2754
dongpai2754 你可能想要研究类似Symfony的ExpressionLanguage组件,它允许评估任意计算,但也会处理卫生/验证等。
接近 2 年之前 回复
dptk0969
dptk0969 是的,总是一个数字,一个运算符(<=,<,>=,>),另一个数字
接近 2 年之前 回复
douji6461
douji6461 输入要达到什么复杂程度?它只是算术吗?总是2个操作数?
接近 2 年之前 回复

2个回答

If you want a safe and flexible solution, this allows you to define a method which is executed depending on the operator matching the key in an array, it only works with two operands, but the last one in the examples # just multiplies the first value by 4 and returns the value...

$operators = [ "<=" => function ($a, $b) { return $a <= $b;},
    "<" => function ($a, $b) { return $a < $b;},
    ">=" => function ($a, $b) { return $a >= $b;},
    ">" => function ($a, $b) { return $a > $b;},
    "#" => function ($a) { return $a * 4; }];

$t = 5;
$s = "<=";
$r = 6;
var_dump($operators[$s]($t,$r));

$s = "<";
var_dump($operators[$s]($t,$r));

$s = ">=";
var_dump($operators[$s]($t,$r));

$s = ">";
var_dump($operators[$s]($t,$r));

$s = "#";
var_dump($operators[$s]($t,$r));

gives...

/home/nigel/workspace2/Test/t1.php:14:
bool(true)
/home/nigel/workspace2/Test/t1.php:17:
bool(true)
/home/nigel/workspace2/Test/t1.php:20:
bool(false)
/home/nigel/workspace2/Test/t1.php:23:
bool(false)
/home/nigel/workspace2/Test/t1.php:26:
int(20)

It's a bit convoluted, but also extensible and safe.

dpx86402
dpx86402 同意! 我不太明白为什么OP排除了开关,因为它是对手头问题最直接的方法(除了eval) - 但他做到了。
接近 2 年之前 回复
douzhong5902
douzhong5902 如果它比交换机更好,那么它是有争议的,因为交换机更直接,但是像许多解决方案一样,它有时候取决于你想要达到的语义
接近 2 年之前 回复
dseve40868
dseve40868 它与使用switch一样高效灵活 - 只有将不同的函数存储在数组中而不是在case语句中进行硬编码。
接近 2 年之前 回复



虽然将代码用作这个(评估作为明文存储的代码)通常不是一个好主意,但是有一个函数 正是如此: eval()</ code>。</ p>

eval()</ code>完成您期望PHP自然完成的任务:评估存储在中的有效代码 一个字符串。</ p>

eval(“var_dump(”。$ t。$ s。$ r。“);”); </ code>将完​​成这项工作 - 但是, 因为这些变量中的任何代码都是毫无疑问地执行的,所以它可能存在安全风险,或者至少会引入一些难以调试的错误。
(需要额外引用和; </ code>) eval中的代码实际上是有效的PHP代码)</ p>
</ div>

展开原文

原文

while it is generally not a good idea to have code usch as this (evaluating code that is sstored as plaintext), there is a function for exactly this: eval().

eval() does what you expect PHP to do naturally: evaluate valid code stored in a string.

eval("var_dump(".$t.$s.$r.");"); will do the job - however, since any code inside those variables is executed without question, it can be a security risk, or at least introduce some hard-to-debug errors. (the extra quoting and the ; are needed to make the code inside eval actually valid PHP code)

duangou1551
duangou1551 OOps,我错过了那一部分。 那么,没有其他方法可以没有使用eval或与使用switch相同的效率相同的缺点。
接近 2 年之前 回复
douzhaishan5462
douzhaishan5462 问题是除了使用eval或switch之外。
接近 2 年之前 回复
dqyz48470
dqyz48470 我知道eval()可以完成这项工作,但关于如何不安全的eval,我想知道是否有另一种方法来计算这个表达式
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐