Как добавить случайный оператор из массива в PHP

Я написал это:

$num1 = mt_rand(1,5); $num2 = mt_rand(1,5); $operators = array( "+", "-", "*", "/" ); $result = $num1 . $operators[array_rand($operators)] . $num2; 

(Мое лучшее предположение) Это не работает так, как я ожидал, потому что в массиве оператор представляет собой строку, которая делает все строкой:

 var_dump($result); 

дает:

 string(3) "4+3" 

Таким образом, мой вопрос заключается в том, как вы порекомендовали бы приблизиться к этому *, не меняя слишком много логики?

Заранее спасибо!!


* Производить случайную операцию среди случайных чисел и, если возможно, операторы должны храниться в массиве.


У меня такое чувство, что мой титул неправильно описывает ситуацию, но я не мог придумать лучшего представления, я открыт для предложений 🙂

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

Я бы предложил определить кучу функций, которые принимают в двух параметрах и возвращать результат, а затем использовать call_user_func_array для результата array_rand .

 function add($x, $y) { return $x + $y; } function subtract($x, $y) { return $x - $y; } function multiply($x, $y) { return $x * $y; } function divide($x, $y) { return $x / $y; } $operators = array('add', 'subtract', 'multiply', 'divide'); //... $result = call_user_func_array($operators[array_rand($operators)], array($x, $y)); 
 <?php $num1 = mt_rand(1, 5); $num2 = mt_rand(1, 5); $operators = array( "+", "-", "*", "/" ); switch ($operators[array_rand($operators)]) { case "+": $result = $num1 + $num2; break; case "-": $result = $num1 - $num2; break; case "*": $result = $num1 * $num2; break; case "/": $result = $num1 / $num2; break; } var_dump($result); 

Чистым решением было бы иметь ветвь кода для каждого оператора, например

 function do_something($num1, $num2, $operator) { switch ($operator) { case '+': return $num1 + $num2; case '-': return $num1 - $num2; case '*': return $num1 * $num2; case '/': return $num1 / $num2; default: throw new Exception('Unknown operator: '.$operator) } } 

Если у вас больше операторов, вы должны создать карту функции operator => function и динамически вызвать функции, например:

 $ftable = array( '+' => 'fn_add', '-' => 'fn_sub', '*' => 'fn_mul', '/' => 'fn_div' ); function fn_add($a, $b) { return $a + $b; } function fn_sub($a, $b) { return $a - $b; } function fn_mul($a, $b) { return $a * $b; } function fn_div($a, $b) { return $a / $b; } function do_something($num1, $num2, $operator) { global $ftable; if (array_key_exists($operator, $ftable)) { return call_user_func($ftable[$operator], $num1, $num2); } else { throw new Exception('Unknown operator: '.$operator) } } 

И, конечно, нечистым (медленным, потенциально опасным) решением было бы использовать eval () .

Создайте функцию для каждой операции, затем сохраните оператор => имя функции в массиве.