Understanding Precedence
Inevitably, after a discussion of the different sorts of mathematical operators comes the discussion of precedence. Precedence refers to the order in which a series of calculations are executed. For example, what is the value of the following variable?
$number = 10 − 4 / 2;
Is $number worth 3 (10 minus 4 equals 6, divided by 2 equals 3) or 8 (4 divided by 2 equals 2, subtracted from 10 equals 8)? The answer here is 8, because division takes precedence over subtraction.
Appendix B, “Resources and Next Steps,” shows the complete list of operator precedence for PHP (including operators that haven’t been covered yet). However, instead of attempting to memorize a large table of peculiar characters, you can bypass the whole concept by using parentheses. Parentheses always take precedence over any other operator. Thus:
$number = (10 − 4) / 2; // 3 $number = 10 − (4 / 2); // 8
Using parentheses in your calculations ensures that you never see peculiar results due to precedence issues. Parentheses can also be used to rewrite complex calculations in fewer lines of code. Let’s rewrite the handle_calc.php script, combining multiple lines into one while maintaining accuracy by using parentheses.
To manage precedence:
- Open handle_calc.php in your text editor or IDE (Script 4.3).
Change the way the total is first calculated (Script 4.4):
$total = (($price * $quantity) + $shipping) - $discount;
Script 4.4. By using parentheses, calculations made over multiple lines (see Script 4.3) can be compressed without affecting the script’s mathematical accuracy.
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/ xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/ xhtml" xml:lang="en" lang="en"> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 6 <title>Product Cost Calculator</title> 7 <style type="text/css" media="screen"> 8 .number { font-weight: bold;} 9 </style> 10 </head> 11 <body> 12 <?php // Script 4.4 - handle_calc.php #3 13 /* This script takes values from calculator.html and performs 14 total cost and monthly payment calculations. */ 15 16 // Address error handling, if you want. 17 18 // Get the values from the $_POST array: 19 $price = $_POST['price']; 20 $quantity = $_POST['quantity']; 21 $discount = $_POST['discount']; 22 $tax = $_POST['tax']; 23 $shipping = $_POST['shipping']; 24 $payments = $_POST['payments']; 25 26 // Calculate the total: 27 $total = (($price * $quantity) + $shipping) - $discount; 28 29 // Determine the tax rate: 30 $taxrate = ($tax/100) + 1; 31 32 // Factor in the tax rate: 33 $total = $total * $taxrate; 34 35 // Calculate the monthly payments: 36 $monthly = $total / $payments; 37 38 // Apply the proper formatting. 39 $total = number_format ($total, 2); 40 $monthly = number_format ($monthly, 2); 41 42 // Print out the results: 43 print "<div>You have selected to purchase:<br /> 44 <span class=\"number\">$quantity</span> widget(s) at <br /> 45 $<span class=\"number\">$price</span> price each plus a <br /> 46 $<span class=\"number\">$shipping</span> shipping cost and a <br /> 47 <span class=\"number\">$tax</span> percent tax rate.<br /> 48 After your $<span class=\"number\"> $discount</span> discount, the total cost is 49 $<span class=\"number\">$total </span>.<br /> 50 Divided over <span class=\"number\"> $payments</span> monthly payments, that would be $<span class=\"number\">$monthly </span> each.</p></div>"; 51 52 ?> 53 </body> 54 </html>
There’s no reason not to make all the calculations in one step, as long as you use parentheses to ensure that the math works properly. The other option is to memorize PHP’s rules of precedence for multiple operators, but using parentheses is a lot easier.
Change how the tax is calculated:
$taxrate = ($tax/100) + 1;
Again, the tax calculations can be made in one line instead of two separate ones.
Save the script, place it in the same directory as calculator.html, and test it in your browser (Figures 4.7 and 4.8).
Figure 4.7 Testing the form one more time.
Figure 4.8 Even though the calculations have been condensed, the math works out the same. If you see different results or get an error message, double-check your parentheses for balance (an equal number of opening and closing parentheses).