Сравнение условий сборки для оператора if

Это возможно?

$var_1 = 1; $var_2 = 10; $comparison = '>'; if($var_1 $comparison $var_2) { // do something... } 

Синтаксис прямо сейчас недействителен, но есть ли способ сделать это?

Не изначально (кроме, конечно, с eval ). Вам нужно будет оценить различные выражения самостоятельно. Создайте функцию обертки и используйте оператор switch . Или для сравнения без выражения простая карта:

 $var_1 = 1; $var_2 = 10; $comparison = '>'; $map = array( ">" => $var_1 > $var_2, "<" => $var_1 < $var_2, "==" => $var_1 == $var_2, "!=" => $var_1 != $var_2, ); if($map[$comparison]) { // do something... } 

Это возможно с помощью

 if (eval("{$var_1} {$comparison} {$var_2}")) { 

Но eval сильно обескуражен, поэтому делайте это только в том случае, если вы не можете добиться желаемого результата иначе

EDIT Как отметил @mario, до тех пор, пока PHP 5.3 это не сработает. В 5.3 это делается. Поэтому для более старых версий это должно быть

 if (eval("return {$var_1} {$comparison} {$var_2};")) { 

Вероятно, вы должны использовать eval() . Как и в других языках программирования, PHP eval() также является мощным и опасным – будьте осторожны.

Если вы напишете что-то вроде следующего кода:

 if (eval("$var_1 $comparison $var_2")) { // ... } 

Это не сработает. Поскольку eval() PHP не оценивает выражение , а просто выполняет оператор . Поэтому вам следует:

 eval("\$condition = $var_1 $comparison $var_2;"); // semicolon required! if ($condition) { // ... } 

Он будет работать хорошо, кроме $var_1 или $var_2 не является числом. Например, если $var_1 – это строка, подобная 'hello' , код eval() выполняется:

 eval("\$condition = hello > 2;"); 

Чтобы не нарушать этот код, вам следует избегать знаков доллара $var_1 и $var_2 :

 eval("\$condition = \$var_1 $comparison \$var_2;"); // don't escape $comparison's. 

Я не уверен, что это возможно без хакерского использования выражения eval. Вы могли бы, конечно, обернуть просто проверить, какое сравнение используется в другом выражении if.

 if($comparison == '>' && $var_1 > $var_2) //Do something elseif($comparison == '<' && $var_1 < $var_2) //Do something, and so on 

Метод eval также должен работать, если вы создадите код в строку.

 if(eval("$var_1 $comparison $var_2")) //Do something 

Но первый способ, вероятно, гораздо более предпочтительный.

Вы также можете создать несколько функций, таких как isGreaterThan ($ arg1, $ arg2), isLessThan ($ arg1, $ arg2), а затем сохранить имя функции, которую вы хотите в переменном $ сравнения. Затем вы должны использовать call_user_func_array (), когда хотите его использовать. Вот так :

 function isGreaterThan($val1, $val2) { return $val1 > $val2; } ///////////// $var_1 = 1; $var_2 = 10; $comparison = "isGreaterThan"; if(call_user_func_array($comparison, array($var_1, var_2))) { //do something } 

Похоже, у вас есть несколько вариантов. Надеюсь это поможет.

сделать строку условной, возвращая значение, если true или false

краткая форма оператора if

 $var_1 = 1; $var_2 = 10; $comparison = '>='; eval("\$b=$var_1 $comparison $var_2?1:0;"); if ($b) { //do something }