Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вычисление формулы
Форумы портала PHP.SU » PHP » Программирование на PHP » Вычисление формулы

Страниц (1): [1]
 

1. Stoun - 13 Сентября, 2010 - 02:22:25 - перейти к сообщению
Здравствуйте.
Прошу помочь в решении следующей задачи.
Есть набор переменных типа int.
$A = 2;
$B = 3;
$C = 4;
и т.д.
В виде строковой переменной есть формула, например $text = "A+B*C";
Всё никак не соображу, как с текстовой формулы сделать число, подставив в него значения переменных.
Помогите пожалуйста решить задачу.
Заранее спасибо.
(Добавление)
Решил проблему с помощью функции eval();
Не знаю лучший ли это вариант, но другого пока не придумал.
Вот что вышло:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $A = 2;
  4. $B = 3;
  5. $C = 4;
  6. $text = "A+B*C";
  7. $text = str_replace("A",$A,$text);
  8. $text = str_replace("B",$B,$text);
  9. $text = str_replace("C",$C,$text);
  10. echo eval("return $text;");
  11.  
  12. ?>

Но я буду благодарен. за ваши варианты решения данной задачи.
2. AdMeen - 13 Сентября, 2010 - 10:11:25 - перейти к сообщению
собственно, если не секрет, в чем смысл то? может можно решить задачу более простым методом
3. ded-mazay - 13 Сентября, 2010 - 11:22:31 - перейти к сообщению
Stoun
Действительно, зачем так?
Пишите ф-цию и все..

CODE (php):
скопировать код в буфер обмена
  1. function my_func($A = 0, $B = 0, $C = 0)
  2. {
  3.     $result = $A+$B*$C;
  4.     return $result;
  5. }
  6.  
  7. $A = 2;
  8. $B = 3;
  9. $C = 4;
  10.  
  11. echo my_func($A, $B, $C);
4. JustUserR - 13 Сентября, 2010 - 11:49:23 - перейти к сообщению
Stoun пишет:
В виде строковой переменной есть формула, например $text = "A+B*C";
В случае если вам необходимо проводить вычисление математических выражений определенного формата записанных в виде строки - то в общем случае нужно создать систему разбора таких формул которая будет проводить синтаксический анализ и выделять отдельные лексемы и тд Если используемые вами выражения полностью совместимы с оригинальными элементами языка PHP то для их выполнения можно использовать функцию eval или create_function - но существенным недостаточком в таком случае является невозможность прямого выполнения всех выражений от пользователя поскольку это категорически небезопасно Тем не менее вы можете использовать возможности модуля runkit по огранизации собственного интерпретатора кода - в таком случае все выражения будут выполняться в виртуальном окружении и вы можете получить требуемый результат
5. Stoun - 13 Сентября, 2010 - 18:02:18 - перейти к сообщению
ded-mazay такая функция не подойдёт, так как математическое выражение неизвестно, и количество переменных тоже. Пользователь вводит некоторое количество переменных, которые записаны в БД. А потом он вводит неопределённое количество математических выражений (с простыми арифметическими операциями), по которым вычисляются другие переменные. Собственно они потом и есть результатом программы.

JustUserR, не могли бы вы обьяснить в чем небезопасность использования функции eval()?
6. AdMeen - 14 Сентября, 2010 - 07:54:51 - перейти к сообщению
Stoun пишет:

JustUserR, не могли бы вы обьяснить в чем небезопасность использования функции eval()?


Я конечно не JustUserR, но всё же постараюсь немного разъяснить ситуацию. Функция http://www.php.su/eval " target="_blank">eval , как вам известно, позволяет выполнить строку как php код, т.е. при недостаточной обработке входных данных, злоумышленник может выполнить произвольный php код в вашей системе. Последствия я так думаю объяснять не стоит.
А по теме, почитайте про обратную польскую нотацию. Реализуется она очень просто. Если что будет непонятно, спрашивайте.
7. JustUserR - 14 Сентября, 2010 - 12:06:01 - перейти к сообщению
Stoun пишет:
JustUserR, не могли бы вы обьяснить в чем небезопасность использования функции eval()?
Основные аспекты проблем с безопасностью которые могут возникнуть при использовании функции eval указал AdMeen - тем не менее применение динамически-вычисляемых выражений может привести к гораздо более трудно-обнаружимым проблемам с безопасностью Дело в том что функция eval обеспечивает вычисление выражений на основе значений переменных в реальном времени и применяет рефлексивный результат к основному уровню выполнения - в силу этого для проверки поступающей от пользователя информации необходимо производить поиск и очистку всех допустимых операторов PHP кроме арифметических Также при переходе от выражения в коде к рефлексивному вычислению будет происходить автоматическая интерполяция в строке что позволяет неявно выполнять выражения из других переменных - которые в свою очередь уже не являются напрямую контролируемыми
Кроме того для осуществления проверки пользовательских данных используются строковые функции и регулярные выражения - и в случае их неправильного построения возможен такой случай когда за счет изменения кодовой таблицы текущего соединения - шаблон регулярного выражения не произведет соответствующую фильтрацию

 

Powered by ExBB FM 1.0 RC1