Demand:
To obtain the expected value according to some specified calculation formula.
Example:
Supplied data source $row = Array ( ' PV ' = + , ' uv ' = = 6, ' st ' = ' = 650, ' NUV ' + /-2);//demand formula, some quantity may not exist: such as NO$GX = ' (PV+UV)/(uv-nuv+1) *10+nuv-uv+no/0+3.5 '; $gx = preg_replace ('/[a-z][ A-z_\d]+/i ', ' $row [\ ' ${0}\ '] ', $GX);//after processing formula $STR = "@\ $s = $gx;"; /legal PHP Statement try{ @eval ($STR);//str and eval before using @ Ensure that no errors are displayed, such as a variable does not exist, or a divisor of 0}catch (Exception $e) {}//This side result can be calculated
This method may be thought of, and there are some variations of this method:
1, using Preg_replace_callback
2,preg_replace ('//ie ') uses the E modifier, actually with 11 like
3, using SQL to execute the company, "Select formatted formula", but this method can not process no this variable, there is a divisor of 0 o'clock, will return null
These are my current methods.
Loop 1w times, 0.25 seconds or so,
If 10w times, it will be more than 2 seconds.
This efficiency is not yet acceptable.
Man, is there any good way????
Reply to discussion (solution)
All to discuss ....
First support the landlord
Still want to how fast, can't any faster. You calculate directly with data values:
Echo ($row [' PV '] + $row [' UV '])/($row [' UV ']-$row [' NUV '] + 1) *10+ $row [' NUV ']-$row [' UV '] + $row [' no ']/0+3.5;
The speed should be the fastest, but the test results are the same.
The efficiency test of the second e is no, it feels faster.
Still want to how fast, can't any faster. You calculate directly with data values:
Echo ($row [' PV '] + $row [' UV '])/($row [' UV ']-$row [' NUV '] + 1) *10+ $row [' NUV ']-$row [' UV '] + $row [' no ']/0+3.5;
The speed should be the fastest, but the test results are the same.
Don't you see the need, if the formula changes?
There are hundreds of formulas?
The efficiency test of the second e is no, it feels faster.
Basically, the E modifier is to perform the replace as Eval.
The supplied data source, which needs to be sorted first, $row the number of characters in front of the key row = Array ( ' nuv ' = + 2, ' PV ' = + , ' uv ' = > 6, ' st ' = = 650, $search = Array_keys ($row); $replace = Array_values ($row); function Cal () { global $search, $replace; Demand formula, some quantity may not exist: if no $gx = ' (PV+UV)/(uv-nuv+1) *10+nuv-uv+no/0+3.5 '; $GX = Str_replace ($search, $replace, $GX);//Str_replace instead of preg_replace, the efficiency will be higher $str = "@\ $s = $gx;"; /legal PHP Statement try{ @eval ($STR);//str and eval before using @ Ensure that no errors are displayed, such as a variable does not exist, or a divisor of 0 }catch (Exception $e) {}} $t 1 = Microtime (True); for ($i = 0; $i < 10000; $i + +) { cal ();} Echo Microtime (True)-$t 1;//output:0.18727397918701
PHP code?123456789101112131415161718192021222324252627282930313233//provides a data source that needs to be sorted first, with the number of characters in front of the key row $row = Array (' NUV ' = > 2, ' pv ' = +, ' UV ' = 6, ...
Thank you for your answer.
I have tried this method, but there will be some problems.
$GX = Str_replace ($search, $replace, $GX);
$row = Array ( ' uv ' = = ' nuv '); $gx = ' Uv+nuv+uv '; $gx = Str_replace ($search, $replace, $GX);//output: 50+n 50+50
But the main efficiency exists in eval here, Str_replace replace Preg this way, the efficiency of ascension is not ideal
10,000 times 0.25 seconds is fast enough.
There is a parsing process during eval, which is more time consuming
Time spent on regular and eval tests were tested, preg_replace accounted for more than 30% points, and Eval accounted for over 60% points
The problem is not solved from the code level
You should probably consider precompiling to program files or Phar
Reference 7 Floor USTB reply: PHP code?123456789101112131415161718192021222324252627282930313233//provides a data source that needs to be sorted first, the number of characters of the key row in front $row = Array (' NUV ' = 2, ' PV ' = +, ' UV ' ...
The first line says that it needs to be sorted first ...
Reference 8 Floor Yangball reply: Reference 7 floor USTB reply: PHP code?123456789101112131415161718192021222324252627282930313233//provides the data source, need to first sort, $row = Array (' NUV ' + 2, ' PV ' ...) with a number of characters in front of the key row.
Oh, I'm sorry, I didn't notice.
The first sort is able to solve.
10,000 times 0.25 seconds is fast enough.
There is a parsing process during eval, which is more time consuming
Time spent on regular and eval tests were tested, preg_replace accounted for more than 30% points, and Eval accounted for over 60% points
The problem is not solved from the code level
You should probably consider precompiling to program files or Phar
There is no better way out for the time being. For the time being, use this method first.
It looks like you need to write the extension to make it more reliable.
Fast enough, how fast, what bike?