There doesn't seem to be a way around this. I want to be able to calculate values using variables but in such a way that the value continues to change - however, I cannot simply write out the number, I need a variable.
Here is the problem, look at my example below, if I were to use calculations based on define variable, I would end up using longer and longer calculations and that would be a horible mess.
Like this
print $serveryear . " " . $servercost . " " . ($servercost * HIGH_DEPREC) . " " . ($servercost - $servercost * HIGH_DEPREC) . "\n";
print ($serveryear + 1) . " " . ($servercost - $dodgecost * HIGH_DEPREC) . " " . ($servercost - $servercost * HIGH_DEPREC * HIGH_DEPREC) . " " . ETC . "\n";
It just grows and grows!!!!
At the same time I cannot define a variable for each and every calculation, that too is a mess that grows and grows.
DELL SERVER– Depreciation over 5-year period (Factor: .20)
YEAR Start Value Deprec Ending Value
2004 21297.00 4259.40 17037.60
2005 17037.60 3407.52 13630.08
2006
2007
2008
Any insights, comments, and suggestions will be greatly appreaciated.
Thanks
Catch-22 calculating in PHP
Moderator: General Moderators
- superdezign
- DevNet Master
- Posts: 4135
- Joined: Sat Jan 20, 2007 11:06 pm
Re: Catch-22 calculating in PHP
Save the results into intermediate variables...?
Honestly, I see no pattern in your calculations, so I can't help you much more than that. Your first output has 4 fields, and your second has 3.
Honestly, I see no pattern in your calculations, so I can't help you much more than that. Your first output has 4 fields, and your second has 3.
Re: Catch-22 calculating in PHP
I think I see the pattern. Our goal is to generate a depreciation table similar to this.
Desired Output - (tab-delimited text)
Let's build this script incrementally. Start with a basic PHP script that does nothing but indicate that its output is plain text (instead of HTML) and display a line with four column names separated by tab characters.
depreciation-table.php
Each line of the desired output (after the column names) represents a single year in the depreciation cycle. The repetition appears to be directly related to the year, so we should write a loop based on the year. A while, do-while, or even foreach loop could be used here, but the for loop seems to be the most appropriate.
The header of the for loop contains three expressions separated by semicolons.
depreciation-table.php
To account for the initial value of the thing being depreciated, create a variable outside the loop and assign it a value of 21297.00 (Line 4).
The value should be displayed in the output, so let's add it as an argument to printf() and add a tab separator to the format string along with "%0.2f" to indicate that the value is to be displayed as a floating-point number with two decimal places. (Line 6)
depreciation-table.php
That the value of the object stays the same for each year is, of course, incorrect. So let's calculate the amount of depreciation for each year.
To calculate the amount of depreciation, we multiply the current value by 0.2 (20%). Let's first try putting the expression "$value * 0.2" directly into printf() to display it as a float just as we did with the value. (Line 6)
depreciation-table.php
While this works, we will need to use the amount of depreciation to calculate the ending value; so, instead of writing the multiplication expression twice, let's assign its value to a new variable. The variable assignment goes inside the loop because its value needs to change on each iteration. (Line 6)
depreciation-table.php
We have calculated the depreciation, but the current value will not change until we subtract the depreciation from it. (Line 6)
depreciation-table.php
There is a problem now. While the value is depreciating correctly, the number that appears in the StartValue column is the number that should be in the EndingValue column. We could fix this a number of ways.
We have reached our goal of creating a script that is capable of generating a depreciation table for years 2004-2008 given an initial value of 21297.00 and a depreciation rate of 20% per year, but there is still room for improvement. This script is not as flexible as it could be by adding a few more variables for starting year, ending year, and depreciation rate to allow a user to interact with it.
Edit: This post was recovered from search engine cache.
Desired Output - (tab-delimited text)
Code: Select all
Year StartValue Depreciation EndingValue
2004 21297.00 4259.40 17037.60
2005 17037.60 3407.52 13630.08
2006 13630.08 2726.02 10904.06
2007 10904.06 2180.81 8723.25
2008 8723.25 1744.65 6978.60
depreciation-table.php
Code: Select all
<?php
header('Content-Type: text/plain');
echo "Year\tStartValue\tDepreciation\tEndingValue\n";
?>Code: Select all
Year StartValue Depreciation EndingValue
Code: Select all
for (A; B; C)- A is an initialization expression that is evaluated before the loop. In our loop, we will initialize the year to be 2004. (Line 4)
- B is a conditional (test) expression that is evaluated before each iteration. If the condition is true, the loop continues through the next iteration. If it is false, the loop stops. In our loop, we will check if the year is less than or equal to 2008. (Line 4)
- C is an update expression that is evaluated after each iteration. In our loop, we will increment the year; so after the first iteration, the year will become 2005. (Line 4)
depreciation-table.php
Code: Select all
<?php
header('Content-Type: text/plain');
echo "Year\tStartValue\tDepreciation\tEndingValue\n";
for ($year = 2004; $year <= 2008; $year++) {
printf("%u\n", $year);
}
?>Code: Select all
Year StartValue Depreciation EndingValue
2004
2005
2006
2007
2008
The value should be displayed in the output, so let's add it as an argument to printf() and add a tab separator to the format string along with "%0.2f" to indicate that the value is to be displayed as a floating-point number with two decimal places. (Line 6)
depreciation-table.php
Code: Select all
<?php
header('Content-Type: text/plain');
echo "Year\tStartValue\tDepreciation\tEndingValue\n";
$value = 21297.00;
for ($year = 2004; $year <= 2008; $year++) {
printf("%u\t%0.2f\n", $year, $value);
}
?>Code: Select all
Year StartValue Depreciation EndingValue
2004 21297.00
2005 21297.00
2006 21297.00
2007 21297.00
2008 21297.00
To calculate the amount of depreciation, we multiply the current value by 0.2 (20%). Let's first try putting the expression "$value * 0.2" directly into printf() to display it as a float just as we did with the value. (Line 6)
depreciation-table.php
Code: Select all
<?php
header('Content-Type: text/plain');
echo "Year\tStartValue\tDepreciation\tEndingValue\n";
$value = 21297.00;
for ($year = 2004; $year <= 2008; $year++) {
printf("%u\t%0.2f\t%0.2f\n", $year, $value, $value * 0.2);
}
?>Code: Select all
Year StartValue Depreciation EndingValue
2004 21297.00 4259.40
2005 21297.00 4259.40
2006 21297.00 4259.40
2007 21297.00 4259.40
2008 21297.00 4259.40
depreciation-table.php
Code: Select all
<?php
header('Content-Type: text/plain');
echo "Year\tStartValue\tDepreciation\tEndingValue\n";
$value = 21297.00;
for ($year = 2004; $year <= 2008; $year++) {
$depreciation = $value * 0.2;
printf("%u\t%0.2f\t%0.2f\n", $year, $value, $depreciation);
}
?>Code: Select all
Year StartValue Depreciation EndingValue
2004 21297.00 4259.40
2005 21297.00 4259.40
2006 21297.00 4259.40
2007 21297.00 4259.40
2008 21297.00 4259.40
depreciation-table.php
Code: Select all
<?php
header('Content-Type: text/plain');
echo "Year\tStartValue\tDepreciation\tEndingValue\n";
$value = 21297.00;
for ($year = 2004; $year <= 2008; $year++) {
$depreciation = $value * 0.2;
$value = $value - $depreciation;
printf("%u\t%0.2f\t%0.2f\n", $year, $value, $depreciation);
}
?>Code: Select all
Year StartValue Depreciation EndingValue
2004 17037.60 4259.40
2005 13630.08 3407.52
2006 10904.06 2726.02
2007 8723.25 2180.81
2008 6978.60 1744.65
- We could add the depreciation back into the StartValue column and put the expression "$value + $depreciation" in printf(), but that would mean an extra arithmetic operation.
- We could print the year and the value before subtracting the depreciation, but then two printf() statements would be required to display each line.
- In order to avoid the extra arithmetic operation and use a single printf() statement, the old value must be stored in another variable before the subtraction. (Line 7) The old value is then used for the StartValue argument in printf() and an EndingValue argument is added to printf() for the depreciated value. (Line 8)
Code: Select all
<?php
header('Content-Type: text/plain');
echo "Year\tStartValue\tDepreciation\tEndingValue\n";
$value = 21297.00;
for ($year = 2004; $year <= 2008; $year++) {
$depreciation = $value * 0.2;
$old_value = $value;
$value = $value - $depreciation;
printf("%u\t%0.2f\t%0.2f\t%0.2f\n", $year, $old_value, $depreciation, $value);
}
?>Code: Select all
Year StartValue Depreciation EndingValue
2004 21297.00 4259.40 17037.60
2005 17037.60 3407.52 13630.08
2006 13630.08 2726.02 10904.06
2007 10904.06 2180.81 8723.25
2008 8723.25 1744.65 6978.60
Edit: This post was recovered from search engine cache.