2014-10-08 4 views
0

Согласно пользовательскому вводу я выполняю запрос, а затем некоторую математику по результатам. Моя проблема в том, что я храню математику в переменной и не могу ее прочитать как математику. Например:php - использование переменной в виде формулы

$Math=($ArryDBs[$i]['GSE45728_01']+$ArryDBs[$i]['GSE45728_02'])//this is constructed upon user input 

echo "<table>";//this is coded after Select, where $ArryDBs is generated 
    for ($i=0; $i<$num_rows; $i++){ 
    echo "<tr>"; 
     echo "<td> 1) From Math: ".$Math."</td>"; 
     echo "<td> 2) Direct: ".($ArryDBs[$i]['GSE45728_01']+$ArryDBs[$i]['GSE45728_02'])."</td>"; 
    echo "</tr>"; 
    } 
echo "</table>"; 

Выход следующим образом (обратите внимание, что выражения для 1) и 2) те же):

1) From Math: ($ArryDBs[$i]['GSE45728_01']+$ArryDBs[$i]['GSE45728_02']) 2) Direct: 8.23018 
1) From Math: ($ArryDBs[$i]['GSE45728_01']+$ArryDBs[$i]['GSE45728_02']) 2) Direct: 12.46399 
1) From Math: ($ArryDBs[$i]['GSE45728_01']+$ArryDBs[$i]['GSE45728_02']) 2) Direct: 15.08906 

значения в 2) Direct является то, что я хочу. Но он изменяется в соответствии с вводом пользователей. Вот почему я сохраняю выражение в переменной. Его чтение переменной буквально как строка. Все связанные вопросы предполагают использование eval(), хотя всегда люди (и само руководство) не поощряют его использование.

Мой вопрос: как я могу получить $ Math как операцию для выполнения?

+0

Если подставлять переменные выше поплавками, я получаю ожидаемый результат: '1) From Math: 67 2) Direct: 67'. Пробовали ли вы перечислить переменные в правильные числовые значения? – Crackertastic

+0

@Crackertastic: Я не уверен, действительно ли правильные числовые значения, и просмотрю мой код. Для простоты я написал $ Math напрямую, но на самом деле он построен с такими вещами, как '$ ForMath [$ key]. =" \ $ ArrayDBs [\ $ i] ['". $ Key." _ ". $ Matches [1] [$ n]. "']"; $ Math = array_values ​​($ ForMath); 'и в коде моего вопроса называется $ Math [0] или аналогичным. Во всяком случае, когда повторение «чтения» совпадает с выражением, которое я хочу оценить. Я тщательно рассмотрю свой код (я ни в коем случае не эксперт ...). Спасибо. – CMArg

+0

Обычно PHP хорош в том, что он принимает строки, которые _ «думает» _ являются числами и делает кастинг для вас до арифметики, но PHP отнюдь не идеален. Вы всегда можете попробовать помещать вещи как '(float)' или '(int)' перед переменными, чтобы сказать PHP, чтобы сбрасывать переменную. Функция PHP [settype()] (http://php.net/manual/en/function.settype.php) также полезна, так как она вернет логическое значение, позволяя вам знать, успешно ли выполнено бросок. – Crackertastic

ответ

0

PHP не является рекурсивно исполняемым. Вы не можете встроить PHP-код внутри строки и ожидать, что PHP также выполнит его.

например.

<?php 

echo "Hello <?php echo 'world' ?>"; 

?> 

собирается напечатать, буквально:

Hello <?php echo 'world' ?> 

Если вы хотите, чтобы содержимое переменной следует рассматривать как «математика» (например, код PHP), то вы должны выполнить эти данные, например

php > $foo = "echo 1+1;"; 
php > eval($foo); 
2 

и обратите внимание, что содержимое переменной должно быть VALID-кодом php. eval('1+1') вычислит 2, но поскольку это значение не назначено нигде или не возвращается ни к чему, оно просто будет выброшено.


комментарий Followup:

php > $a = 1; 
php > $b = 2; 
php > $c = 3; 
php > $d = 4; 
php > $foo = '$bar = ($a + $b) * ($c + $d);'; 
php > eval($foo); 
php > echo $bar; 
21 

работает так, как ожидалось.

+0

Вы правы. Это проблема. Но я все еще не могу «полностью» оценить $ Math [0], который гласит: ($ ArrayDBs [$ i] ['GSE45728_01'] + $ ArrayDBs [$ i] ['GSE45728_02']). Когда я пытался с помощью 'eval (" \ $ Math2 = \ "$ Math [0] \"; ");', ответ: '(Array ['GSE45728_01'] + Array ['GSE45728_02'])' (код оценивает '$ ArrayDBs [$ i]', но не второй компонент массива ('[' GSE45728_02 '] '). Любые идеи? – CMArg

+0

стандартное поведение php для многомерных массивов в строках с двойными кавычками. (фигурный) синтаксис ": http: // php.net/manual/en/language.types.string.php –

+0

Практически там. Мне нужно учиться и понимать гораздо больше, и я буду пробовать это сам, но если кто-то может мне только помочь, я буду благодарен. Если переменная определена как '({$ ArregloDBs [$ i] ['GSE45728_01']} + {$ ArregloDBs [$ i] ['GSE45728_02']})/({$ ArregloDBs [$ i] ['GSE45728_03'] } + {$ ArregloDBs [$ i] ['GSE45728_04']}) ', я получаю' (5.38084 + 2.84934)/(3.28155 + 3.96505) '. Id est, он правильно оценивает значения массива, но не выполняет операции между значениями массива. Что еще мне нужно? возможно, eval() eval()? – CMArg

Смежные вопросы