13

Say I have a string, $char. $char == "*".

I also have two variables, $a and $b, which equal "4" and "5" respectively.

How do I get the result of $a $char $b, ie 4 * 5 ?

Thanks :)

7 Answers 7

21

You can use eval() as suggested by @konforce, however the safest route would be something like:

$left = (int)$a;
$right = (int)$b;
$result = 0;
switch($char){

  case "*":
    $result = $left * $right;
    break;

 case "+";
   $result = $left + $right;
   break;
// etc

}
Sign up to request clarification or add additional context in comments.

1 Comment

that's the answer I was looking for :)
10

safest method is a switch construct:

function my_operator($a, $b, $char) {
    switch($char) {
        case '=': return $a = $b;
        case '*': return $a * $b;
        case '+': return $a + $b;
        etc...
    }
}

4 Comments

yep...people answer too fast!
if the operator is = your code will produce sum of operands. Should not there be a break?
The '=' wouldn't do anything in this case, unless $a was passed in as a reference. The assignment would be lost as soon as the function returns, otherwise. It's just an example.
@ShaktiSingh No need for break when there's return
6

The easiest but most dangerous method is to use eval.

$c = eval("return $a $char $b;");

5 Comments

I'd rather not use eval as the values come from user input.
@konforce: At last all we have to use the code in production they why we suggest eval
@Fela, you should always be validating the user input whether you use eval or not. If you are validating that $a and $b are proper numbers and that $char is a proper operation then eval will be safe. That said, I would still not use eval on a public site.
if it's a local project, there is no reason not to use eval.
I'm not using eval, I'm using switches with different operators. All user input is sanitised of course.
2

Another way to avoid creating a switch/case, could be:

<?php 
// Doesn't matter if $a and $b are integers or strings
$a = 100;
$b = 1000;
$operator = ">";

$operations = [
  '='  => $a == $b,
  '>'  => $a > $b,
  '>=' => $a >= $b,
  '<'  => $a < $b,
  '<=' => $a <= $b,
  '<>' => $a <> $b,
];

// It will get the value of $a > $b and the result will be false
$operations[$operator]
?>

Finally if you prefer, you can move the $operations array, to a function to improve the readability code.

<?php 
// Doesn't matter if $a and $b are integers or strings
$a = 100;
$b = 1000;
$operator = ">";

// It will get the value of $a > $b and the result will be false
$result = getOperationResult($a, $b, $operator);

function getOperationResult(string|int $a, string|int $b, string $operator): bool
{
    $operations = [
      '='  => $a == $b,
      '>'  => $a > $b,
      '>=' => $a >= $b,
      '<'  => $a < $b,
      '<=' => $a <= $b,
      '<>' => $a <> $b,
    ];

    return $operations[$operator];
}
?>

Comments

1

take a look at the eval() function. you will need to build a proper php command and run inside the eval() to extract out the result.

Comments

1

You can do with eval however I would not suggest using eval.

If there is case operator can by anything you should check what operator is before using

switch($char)
{
  case '*':
    $result= $a * $b;
    break;

  case '+':
    $result= $a + $b;
    break;
}

1 Comment

Yes, I'm going to go with that option. Thanks :)
-1
<?php
$a = 'alex';
$b = "alex";
$c = "==";
function abc($a,$b,$c){
  $d = 'return ($a '.$c.' $b) ? true : false;';
  return eval($d);
}
if(abc($a,$b,$c)){
  echo "condition true";
}else{
  echo "condition false";
}
// echo $e;
?>

1 Comment

please explain your solution

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.