I've spent the last few evenings learning PHP, CSS and HTML through Codecademy and now on Team Treehouse. My goal is to progress with PHP over the next year or two and perhaps obtain Zend cert.

Anyway, I've worked on a simple calculator to test what I've learned. I'd like to see, (given the same 'functionality')what more experienced programmers would come up with. I think this would enhance my learning curve.

I've used a switch statement, because I'm not sure if it's possible to do something like this:

Variable = Math Operator

Var1 = User Input
Var2 = User Input

Variable3 = Var1 Variable Var2

Example, if you entered *, 2, 2, Variable 3 would = 4.

I tried a few ways but could not make it work, so had to settle with a switch which seems cumbersome.

<?php
$input1    = $_GET["num1"];
$input2    = $_GET["num2"];
$input3    = $_GET["symbol"];
$mathinput = "Not Selected";


switch ($input3) {
    case "*":
        $input3    = "*";
        $mathinput = "Multiplication";
        $result    = $input1 * $input2;
        break;
    case "/":
        $input3    = "/";
        $mathinput = "Division";
        $result    = $input1 / $input2;
        break;
    case "+":
        $input3    = "+";
        $mathinput = "Addition";
        $result    = $input1 + $input2;
        break;
    case "-":
        $input3    = "-";
        $mathinput = "Subtraction";
        $result    = $input1 - $input2;
        break;
    default:
        $input3    = "0"; 
        $mathinput = "Invalid Operator";
}
if ($input3=="0"){
    echo '<div id="result"> <p>You have entered a bad operator</p> </div>' ;
}
else{
    echo '<div id="result"> <p>Result: ' . $result . '</p> </div>';
}  
?>
up vote 1 down vote accepted

No it's not possible writing

Variable3 = Var1 Variable Var2

With the Variable as an operator, i decided to use call_user_func to call the BC Math functions http://php.net/manual/en/ref.bc.php

I removed the $mathinput since you were not using it anyway.

Result

<?php
$input1    = $_GET["num1"];
$input2    = $_GET["num2"];
$operator  = $_GET["symbol"];

$operators = [
    '+' => 'bcadd',
    '-' => 'bcsub',
    '*' => 'bcmul',
    '/' => 'bcdiv',
    '%' => 'bcmod',
];

$result = array_key_exists($operator, $operators) 
        && is_numeric($input1) 
        && is_numeric($input2) 
        ? call_user_func($operators[$operator], $input1, $input2) 
        : null;
?>      

<?php if (!$result) : ?>
        <div id="result">
            <p>Error: Invalid input or arithmetic operator.</p> 
        </div>
<?php else: ?>
        <div id="result">
            <p>Result: <?= $result; ?></p> 
        </div>
<?php endif; ?>

EDIT

The array_key_exists function checks if a given key exists in the array. http://php.net/manual/en/function.array-key-exists.php

The following is a shorthand if / ternary logic

$var = array_key_exists($operator, $operators) 
&& is_numeric($input1) 
&& is_numeric($input2)
? 'all true' : 'conditions not met';

Simply checks if all the conditions are true, if so the above example would set $var to a string with a value of 'all true', if one of the conditions would return false, the $var would be set to 'conditions not met'

You could write the above snippet using regular if / else statements like this:

if(array_key_exists($operator, $operators) && is_numeric($input1) && is_numeric($input2)) {
    $var = 'all true';
}
else {
    $var = 'conditions not met';
}

Using ternary logic could have some of the following advantages when used properly.

  1. Makes coding simple if/else logic quicker
  2. Makes code shorter
  3. Makes maintaining code quicker, easier
  • This is interesting. I like the use of the array. Can you explain the syntax of the array_key_exists, specifically the ? before call_user_func after $input2, and the :null – rskel Feb 20 '16 at 13:18
  • Thanks for the edit. I'll spend some time tonight going through this in more detail. I've read about some of the ternary logic in the Zend php course book. – rskel Feb 20 '16 at 18:48
  • @JazzCat well said, well explained! – Vasikos Mar 3 '16 at 22:47

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.