free machines directory - Debt Consolidation - Bet365 bonus - Deaf Topics - Debt Consolidation

PDA

View Full Version : A question about PHP Function


sunnyboy1984
Mar 1st 2007, 4:53 am
Can anyone fix this code by creating as many functions as needed to eliminate repetition and utilize code reusability? Please comment where neccessary. Thank you.


<B>Checkout</B><br>
Below is a summary of the products you wish to purchase, along with totals:
<?php

#tax rate is constant
$tax = 0.08;
$total_price = 0;
$total_tax = 0;
$total_shipping = 0;
$grand_total = 0;
?><ul><?

$product = "Candle Holder";
$price = 12.95;
$shipping = 0; //free shipping
echo "<li>".$product.": $".$price;

//tally totals
$total_price += $price;
$total_tax += $tax * $price;
$total_shipping += $shipping * $price;
$grand_total += ($total_price + $total_tax + $total_shipping);

$product = "Coffee Table";
$price = 99.50;
$shipping = 0.10; //shipping as a percentage of price
echo "<li>".$product.": $".$price;

//tally totals
$total_price += $price;
$total_tax += $tax * $price;
$total_shipping += $shipping * $price;
$grand_total += ($total_price + $total_tax + $total_shipping);

$product = "Lamp";
$price = 42.99;
$shipping = 0.10; //shipping as a percentage of price
echo "<li>".$product.": $".$price;

//tally totals
$total_price += $price;
$total_tax += $tax * $price;
$total_shipping += $shipping * $price;
$grand_total += ($total_price + $total_tax + $total_shipping);

?>
</ul>
<hr>
Subtotal: $<? echo number_format($total_price, 2); ?><br>
Tax: $<? echo number_format($total_tax, 2); ?><br>
Shipping: $<? echo number_format($total_shipping, 2); ?><br>
<B>Total: $<? echo number_format($grand_total, 2); ?></B>

exam
Mar 1st 2007, 7:09 am
I'd probably make a 'product' class/object and do the calculations internally.

Aragorn
Mar 1st 2007, 7:26 am
The following line of code is wrong.
$grand_total += ($total_price + $total_tax + $total_shipping);
It should be
$grand_total = ($total_price + $total_tax + $total_shipping);

azizny
Mar 1st 2007, 7:38 am
The following line of code is wrong.

It should be
$grand_total = ($total_price + $total_tax + $total_shipping);

But you are going to erase the grand_total?

You can use the original code:


$grand_total += ($total_price + $total_tax + $total_shipping);


or


$grand_total = $grand_total + $total_price + $total_tax + $total_shipping;


Peace,

Aragorn
Mar 1st 2007, 7:42 am
Here is an object oriented approach

<?php
// Begin Class Definition
class calcTax{
var $tax = 0.08;
var $totalPrice = 0;
var $totalTax = 0;
var $totalShipping = 0;
var $grandTotal = 0;
// Class constructor
function calcTax($tax = FALSE){
if($tax !== FALSE){
$this->tax = $tax;
}
}
// Use the fourth variable to decide whether or not to print the price
function newProduct($product, $price, $shipping = 0, $print = TRUE){
$this->totalPrice += $price;
$this->totalTax += $price * $this->tax;
$this->totalShipping += $price * $shipping;
$this->grandTotal = $this->totalPrice + $this->totalTax + $this->totalShipping;
if($print){
echo "<li>$product : \$$price</li>";
}
}
// Print the sub total
function subTotal(){
echo 'Subtotal: $' . number_format($this->totalPrice, 2) . '<br/>';
echo 'Tax: $' . number_format($this->totalTax, 2) . '<br/>';
echo 'Shipping: $' . number_format($this->totalShipping, 2) . '<br/>';
echo '<b>Total: $' . number_format($this->grandTotal, 2) . '</b><br/>';
}
} // End Class Definition


$ct = new calcTax(0.08);
$ct->newProduct("Candle Holder", 12.95);
$ct->newProduct("Coffee Table", 99.5, 0.10);
$ct->newProduct("Lamp", 42.99, 0.1);
echo '<hr/>';
$ct->subTotal();
?>

Aragorn
Mar 1st 2007, 7:53 am
Here is a little more simpler, less generic code.

<?php

function newProduct($product, $price, $shipping = 0){
global $tax, $totalPrice, $totalTax, $totalShipping, $grandTotal;
$totalPrice += $price;
$totalTax += $price * $tax;
$totalShipping += $price * $shipping;
$grandTotal = $totalPrice + $totalTax + $totalShipping;
echo "<li>$product : \$$price</li>";
}
// Print the sub total
function subTotal(){
global $totalPrice, $totalTax, $totalShipping, $grandTotal;
echo 'Subtotal: $' . number_format($totalPrice, 2) . '<br/>';
echo 'Tax: $' . number_format($totalTax, 2) . '<br/>';
echo 'Shipping: $' . number_format($totalShipping, 2) . '<br/>';
echo '<b>Total: $' . number_format($grandTotal, 2) . '</b><br/>';
}

$tax = 0.08;
$totalPrice = 0;
$totalTax = 0;
$totalShipping = 0;
$grandTotal = 0;

newProduct("Candle Holder", 12.95);
newProduct("Coffee Table", 99.5, 0.10);
newProduct("Lamp", 42.99, 0.1);
echo '<hr/>';
subTotal();
?>
Hope the code is clear. Feel free to ask otherwise :)

Aragorn
Mar 1st 2007, 8:00 am
But you are going to erase the grand_total?

You can use the original code:


$grand_total += ($total_price + $total_tax + $total_shipping);


or


$grand_total = $grand_total + $total_price + $total_tax + $total_shipping;


Peace,

You are wrong :)

The grand total is the sum of the Total Price + Total Tax + Total Shipping
or
Grand Total + Price of last item + Tax for last item + Shipping charge for last item.

Hope you got the difference. You should use '+=' either with $grand_total or ($total_price & $total_tax & $total_shipping). Check the output of the original code. It is

Subtotal: $155.44
Tax: $12.44
Shipping: $14.25
Total: $327.51

With such calculation you are not going to stay in business for long :D