Я написал это:
$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 () .
Создайте функцию для каждой операции, затем сохраните оператор => имя функции в массиве.