How to use a formula stored in mysql, eks: (A + B + C)/(E + F)

How to use several formulas stored in a db?

I have several formulas, it's basic math operations, (AB + AC + AD + AE)/7 etc, the AB' is data has to replaced by values stored in different tables.

I tried to set a rule that each value has to be stored with a space and then split the function up in to a array and the use a loop and then create something like the c++ postfix expression and get the end value,

maybe this can be done easier? I don't like that the formula has to be entered with spaces, it could easily become problem.. I guess that the space thing can be solved by parsing it with regular expressions,

I have tried a bit, here's the start of that code:

sample Formula:( ( A1 + A2 ) + A3 + A4 + A5 + A6 + A7 )

\$seperators = array('A1', 'A2','A3','A4','A5','A6', 'A7');

//just replacing the string with a sample number: 1
\$str = str_replace(\$seperators,'1',\$str);

\$str = (preg_split('# #',\$str));

for(\$i=0; \$i<count(\$str); \$i++){

if( \$str[\$i] == '+' || \$str[\$i] == '-' || \$str[\$i] == '*' || \$str[\$i] == '/' ){
//do something

}else if( \$str[\$i] == ')' ){
//do something

}else
//do something
}
LVL 1
Who is Participating?

x

Commented:
I'm wary of trying to parse expressions by hand, when expressions like that are Context-Free (so a regular expression is insufficient to parse them).  Here's one approach that may be valid if you can carefully control formulas as they're entered:

\$variables = array('A1' => 3, 'A2' => 3748.12, ....);
\$expression = '((A1 +

foreach(\$variables as \$var => \$value) {
str_replace(\$var, \$value, \$expression);
}
eval('\$result = ' . \$expression);
echo \$result;

Instead of str_replace() you'd really have to do a preg_replace() to make sure you don't accidentally fill in the value for A1 in place of A11 and A111 and A1111 and leave a whole huge mess, but the principle is sound.

It's also a nasty way to expose the system if you allow through a formula that actually contains PHP code.

Just an "out of the box" line of thinking to consider.
0

Author Commented:
ok, thanx, that works,

Is it ok to use eval?

have problem as you said to se the differen between A1 and A11..
0

Commented:
I'd suggest using preg_replace() instead of str_replace() so you could build a regexp like, perhaps '/\bA1\b/'

Perhaps
\$expression = preg_replace('/\b' . \$var . '\b/', \$value, \$expression);

Here note that \b is a "word boundary" in a regular expression, so "A1" followed by another "1" will not be considered an entire word, and will not get matched.  A1 followed by a + or a space or any other non-word character will get replaced.
0

Author Commented:
That worked! thanx.

Is it possible to expand the formula with >< (bigger or smaller)?
0

Commented:
Absolutely; that's why I suggested eval() -- it'll run absolutely any valid PHP code.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.