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 » Напишите за меня, пожалуйста » Математические формулы

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

1. Djin_dj - 23 Июня, 2008 - 12:57:05 - перейти к сообщению
Уважаемые товарищи!
Появился вопрос!
К примеру у меня есть строка:
$str = '(Параметр1+Параметр3/Параметр4)*Параметр2'
Кто нить подскажет как это дело можно распарсить, чтобы при вводе в форму некоего значения к примеру $_POST['Параметр1'] = 1;$_POST['Параметр2'] = 2;$_POST['Параметр3'] = 3;$_POST['Параметр4'] = 4; вывелось не строка (Параметр1+ и тд) а именно формула посчиталась (1+3/4)*2 = 3,5
Чтобы ответ получился числовым, а соответственно, чтобы из формы значения подставлялись в строку и считались как формула!
Заранее благодарен. Дайте хотя бы пример на двух выражениях, я подумаю как с этим быть!
2. D1mOn - 23 Июня, 2008 - 13:22:06 - перейти к сообщению
Приведите все переменные к типу int и будет Вам счастье

$str = intval($_POST['Параметр1'])+intval($_POST['Параметр3']) и т.д.
3. Djin_dj - 23 Июня, 2008 - 13:58:04 - перейти к сообщению
D1mOn пишет:
Приведите все переменные к типу int и будет Вам счастье

$str = intval($_POST['Параметр1'])+intval($_POST['Параметр3']) и т.д.

Тогда немного подругому опишу проблему:

Есть поле в мюскле в него заносится формула к примеру Parametr_1+Parametr_2/Parametr3 и тд
Я ее извлекаю из базы и как мне разбить на интвалы тогда, то есть парсить Parametr_x, бить строку explode() на массив или все такие можно str_replace('Parametr_$x', intval(Parametr_x)), тогда как он знаки вычитания сложения и тд будет парсить руками забивать надо!?
4. D1mOn - 23 Июня, 2008 - 14:04:15 - перейти к сообщению
Если Вам нужен только результат формулы: т.к сначало делается умножение и деление разбиваем explode() по символу *, приводим к ИНТ, перемножаем полученные значения массива, потом тоже самое в математическом порядке со всем остальным.

Идея пришла моментально, прошу не судить.
5. Djin_dj - 23 Июня, 2008 - 14:14:36 - перейти к сообщению
D1mOn пишет:
Если Вам нужен только результат формулы: т.к сначало делается умножение и деление разбиваем explode() по символу *, приводим к ИНТ, перемножаем полученные значения массива, потом тоже самое в математическом порядке со всем остальным.

Идея пришла моментально, прошу не судить.

То есть получается если формула x1+x2/x3-pow(x4*x5, x6/x7)
то мне как то надо считать количество элементов в массиве explode('*',$str) и '-' и тд. причем explode бьет правую от левой и тд, а мне надо вынимать значения.
Хорошо, тогда подскажите, как вынимать значения из массива. как узнать его максимальный элемент.
к примеру в том примере '/' будет массив $strdelenie[0] = x1+x2 и $strdelenie[1] = x3-pow(x4*x5,x6 и $strdelenie[2]= x7, стопудово даст ошибку.
по логике надо вкладывать цикл в цикле, а вот цикл в цикле в php не очень хорошо насколько я знаю и обрабатывать он это дело будет долго.
6. D1mOn - 23 Июня, 2008 - 14:18:36 - перейти к сообщению
Пля, кинул не подумавши. Может регулярами?
7. Djin_dj - 23 Июня, 2008 - 14:21:47 - перейти к сообщению
D1mOn пишет:
Пля, кинул не подумавши. Может регулярами?

а если по-подробнее!? не сталкивался еще с регулярами
8. EuGen - 23 Июня, 2008 - 14:24:51 - перейти к сообщению
Думаю, все намного проще можно решить.
При помощи str_replace заменить имена параметров на соответствующие значения, а затем:
http://php.su/functions/?eval
9. Djin_dj - 23 Июня, 2008 - 14:35:07 - перейти к сообщению
EuGen пишет:
Думаю, все намного проще можно решить.
При помощи str_replace заменить имена параметров на соответствующие значения, а затем:
http://php.su/functions/?eval

Спасиба, часть дела сделано:
только вот что получается
1/((1+1*(1/1))*pow((1+1/1),(1*1))*(1+1*(1/1)))
из поля:
$Parametr_1/((1+$Parametr_2*($Parametr_6/$Parametr_5))*pow((1+$Parametr_2/$Parametr_4),($Parametr_4*$Parametr_3))*(1+$Parametr_2*($Parametr_7/$Parametr_5)))
Но вектор хороший, теперь осталось чтобы он сложил
10. D1mOn - 23 Июня, 2008 - 14:35:55 - перейти к сообщению
Пля, ну хотел ведь про eval сказать, но про евал )
11. Djin_dj - 23 Июня, 2008 - 14:36:14 - перейти к сообщению
EuGen пишет:
Думаю, все намного проще можно решить.
При помощи str_replace заменить имена параметров на соответствующие значения, а затем:
http://php.su/functions/?eval

то есть я уже в базу изначально переменные оформлял, чтобы потом не реплэйсить, или лучше не забивать $ туда?
12. D1mOn - 23 Июня, 2008 - 14:38:32 - перейти к сообщению
Не забудьте о защите, евал штука опасная.

Не проверил евал, сайт про...) (с)
13. Djin_dj - 23 Июня, 2008 - 14:42:11 - перейти к сообщению
D1mOn пишет:
Не забудьте о защите, евал штука опасная.

Не проверил евал, сайт про...) (с)

В чем опасность?
14. EuGen - 23 Июня, 2008 - 14:50:42 - перейти к сообщению
Да, в БД нужно хранить имена переменных.
Опасность может возникнуть, если Вы в БД пишете формулы, приходящие от пользователей (ведь пользователи тогда могут туда написать вредоносный код).
15. Djin_dj - 23 Июня, 2008 - 15:04:50 - перейти к сообщению
EuGen пишет:
Да, в БД нужно хранить имена переменных.
Опасность может возникнуть, если Вы в БД пишете формулы, приходящие от пользователей (ведь пользователи тогда могут туда написать вредоносный код).

в моем случае пользователь это товарищь который не знает что такое pow ему написано делать ^a^b^ а я уже распарсиваю это как pow(a,b) и клиент таков что по роду деятельности не даст при любом раскладе код другому специфика, а если даст, то другие просто скажут, надо новый писать, и читать ничего не буду, скрипты запрещены к коррекции. те админ я и тот товарищь как говорится и в любой момент можно и базу восстановить и user-list прикрыть и все таки как вычислить, может я строку не правильно указал eval ("\$calculator = \"$calculator\";");
или надо через echo eval ("\$calculator = \"$calculator\";");
?

 

Powered by ExBB FM 1.0 RC1