|
<?php
/*
* Flash Calculator via Flash Remoting
* Author: Jeffrey Hill
* Site: www.flash-db.com/remoting/
*/
class calculator
{
function calculator()
{
$this->methodTable = array(
"doMath" => array(
"description" => "Translates a calculation string to numeric calculation.",
"access" => "remote",
"arguments" => array ("calcString")
)
);
}
function doMath($calcString) {
// Calculate string positions:
function findpos($pattern, $sequence) {
$n = -1;
while (ereg($pattern, $sequence)) {
$n++;
$fragment = split($pattern, $sequence);
$trimsize = (strlen($fragment[0]))+1;
$sequence = "*".substr($sequence, $trimsize);
$position[$n] = (strlen($fragment[0]) + $position[($n-1)]);
}
return $position;
}
// preform individual calculations.
function calculate($do,$with,$who) {
switch ($do) {
case "A":
$result = $with + $who;
break;
case "S":
$result = $with - $who;
break;
case "M":
$result = $with * $who;
break;
case "D":
$result = $with / $who;
break;
case "P": // exponential power.
$result = pow($with,$who);
break;
}
return $result;
}
// reg ex pattern.
$pattern = "[ASMDP]";
// get array of string positions.
$posArray = findpos($pattern, $calcString);
for ($i=0; $i< count($posArray);$i++) {
if ($i == 0) {
if ($posArray[$i+1] == false) {
$posEnd = strlen($calcString);
} else {
$posEnd = $posArray[$i+1];
}
// Get the first number in the sequence.
$initNum = substr($calcString, 0, $posArray[$i]);
$initNum = floatval ($initNum);
// get next number in sequence.
$nextNum = substr($calcString, $posArray[$i]+1, $posEnd);
$nextNum = floatval ($nextNum);
// Preform operation.
$currResult = calculate($calcString{$posArray[$i]},$initNum,$nextNum);
} else {
if ($posArray[$i+1] == false) {
$posEnd = strlen($calcString);
} else {
$posEnd = $posArray[$i+1];
}
$nextNum = substr($calcString, $posArray[$i]+1, $posEnd);
$nextNum = floatval ($nextNum);
// Preform operation.
$currResult = calculate($calcString{$posArray[$i]},$currResult,$nextNum);
}
}
return $currResult;
}
}
?>
|