如何在PHP中从数组中添加随机运算符

如何在PHP中从数组中添加随机运算符,php,random,operators,Php,Random,Operators,我写道: $num1 = mt_rand(1,5); $num2 = mt_rand(1,5); $operators = array( "+", "-", "*", "/" ); $result = $num1 . $operators[array_rand($operators)] . $num2; 我的最佳猜测是,这并不像我预期的那样有效,因为在数组中,运算符是一个字符串,它使所有内容都成为字符串: var_dump($result); 给

我写道:

$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


干净的解决方案是为每个操作员设置一个代码分支,例如

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)
  }
}

当然,不干净、缓慢、潜在危险的解决方案是使用。

我会试试看!谢谢好吧,我有点特别喜欢它,因为它实际上解决了问题,但它不是有点多余吗?@Akinator No,不是多余的。eval是邪恶的。好吧,我不知道为什么我不确定,当然它确实解决了问题,所以谢谢,但我会看看它的发展方向。你完全正确,eval是邪恶的。因此,我建议不要使用它我用一个调度图示例扩展了我的答案。您还可以使用“+”=>create_函数。。。或者,在新的PHP版本中,“+”=>函数$a,$b{返回$a+$b;}。你应该使用类而不是全局变量…:非常有竞争力的答案+1,我实际上并没有接受它,因为我觉得@Jacob的答案有点干净,但特别是更符合我的思路,虽然绝对主观,但再次感谢您的伟大回答!谢谢看起来真不错!!出于某种原因,我只是还不相信这个开关的答案。@Akinator,真的。我尽量避免使用switch语句。
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)
  }
}
$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)
  }
}