[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Строку в формулу
walerus
Ребят, подскажите как или в какую сторону смотреть, требуется из текстовой строки сделать математическую формулу для последующего вычисления, т.е. из:
2+2*2, должно получиться 6ть, а не 8мь.

2 + ( 2*2 ) = 6 - Верно, т.к. сначала делается умножение/деление, а уж потом плюс/минус.

2 + 2*2 = 8 - НЕ Верно.

Вот и хочется определить что первоначально делать, а что потом.

Никогда с таким не сталкивался, мб есть функции какие либо или все же придется парсить всю строку, и уже от составляющих плясать ? blink.gif




Спустя 13 минут, 57 секунд (9.12.2011 - 13:52) Семён написал(а):
У тебя по математике 2-йка была?
2+2*2 оно и получается у всех нормальных людей 6, а не 8.

Спустя 11 минут, 39 секунд (9.12.2011 - 14:04) walerus написал(а):
Семён Прочти еще раз название топика и то что я написал, а уж потом пиши у каких людей ( нормальных/НЕ нормальных ) что получается в результате.

Спустя 8 минут, 46 секунд (9.12.2011 - 14:13) Winston написал(а):
echo 2 + 2 * 2; // 6

Спустя 28 секунд (9.12.2011 - 14:13) Семён написал(а):
Я не могу понять это я так отупел за последнее время или люди такими стали?

Цитата
2+2*2, должно получиться 6ть, а не 8мь.

оно получается 6 итак, а не 8, умножение выполняется первым действием по мат. правилам.
Тебе нужно, чтобы скрипт специально для даунов заключал в скобки операции с умножением или извиняюсь за грубость ты просто такой. laugh.gif

Спустя 2 минуты, 18 секунд (9.12.2011 - 14:16) Игорь_Vasinsky написал(а):
тут смотри - 2 решения

1. explode()
2. regexp

всем нам известны приаритеты арифмитичаских вычеслений, а php для этого должен видеть приаритет (скобки)

т.е. допустим есть строка

2+23*2-9/3+3

вот тут проще наверн регуляркой найти все * и / и числа перед ними и после низ начать на ( и закончить на ) (если выражение не в начале)

2+(23*2)-(9/3)+3

Спустя 3 минуты (9.12.2011 - 14:19) walerus написал(а):
Игорь_Vasinsky, Семён, Winston - Ребят, я может не туда полез вообще ?, и делаю ненужные действия.

Я так понял что PHP сам определяет что первоначально ему вычислять (*/+-)?...

т.к. echo 2+23*1-9;, как посоветовал Winston, выдает 16ть, правильный результат...

P.S. Мне нужен именно результат, а не "вид" вычисления...

Спустя 43 секунды (9.12.2011 - 14:19) Семён написал(а):
walerus
Ест естественно, благодать на него сошла!!!

Спустя 1 минута, 41 секунда (9.12.2011 - 14:21) walerus написал(а):
Всем плюсанул biggrin.gif , я как обычно создаю себе лишнюю работу ), всем спасибо !

Спустя 44 секунды (9.12.2011 - 14:22) Семён написал(а):
walerus
Это математика 1 или 2-ого класса. wink.gif

Спустя 42 секунды (9.12.2011 - 14:22) Winston написал(а):
walerus
А до того как задать вопрос, ты сам пробовал вывести 2 + 2 * 2 ?

Спустя 17 секунд (9.12.2011 - 14:23) Игорь_Vasinsky написал(а):
а я тупанул biggrin.gif

Спустя 49 секунд (9.12.2011 - 14:24) walerus написал(а):
Семён - Да то понятно что это математика, я не сказал что я не знаю как вычислять, мне нужно было для того, что будет поле для ввода разных формул, и скрипт должен будет посчитать...

Спустя 55 секунд (9.12.2011 - 14:24) walerus написал(а):
Winston - Не ), я сразу писал в скобках )) т.е.
echo 2 + ( 2*2 );


Спустя 22 минуты, 15 секунд (9.12.2011 - 14:47) killer8080 написал(а):
walerus
$text = '2 + 2 * 2';
eval('$math= '. $text. ';');
echo $math;

Спустя 2 минуты, 20 секунд (9.12.2011 - 14:49) Семён написал(а):
killer8080
если уж через eval можно там просто return написать чтобы не создавать переменную

Спустя 25 секунд (9.12.2011 - 14:49) walerus написал(а):
killer8080 - Спасибо за вариант )

Спустя 6 минут, 48 секунд (9.12.2011 - 14:56) walerus написал(а):
Цитата
если уж через eval можно там просто return написать чтобы не создавать переменную

Семён Поподробнее пожалста ))..

Спустя 4 минуты, 46 секунд (9.12.2011 - 15:01) killer8080 написал(а):
Цитата (walerus @ 9.12.2011 - 13:56)
Цитата
если уж через eval можно там просто return написать чтобы не создавать переменную


Семён Поподробнее пожалста ))..

$text = '2 + 2 * 2';
echo eval('return '. $text. ';');

Ну и конечно про безопасность не забываем :)

Спустя 58 секунд (9.12.2011 - 15:02) walerus написал(а):
Понял, сенк всем ).

Спустя 1 час, 24 секунды (9.12.2011 - 16:02) walerus написал(а):
function string_to_math_function( $string )
{
$string = preg_replace( '/([+*\/\-])/', ' $1 ', $string );

$tmp = explode( " ", preg_replace( '~\s\s+~', ' ', $string ) );

$result = '';
$open = false;
$close = false;

$tmp_count = count($tmp) -1;
foreach( $tmp as $tmp_key => $tmp_value )
{
if ( preg_match('~[*\/]~', $tmp_value ) )
{
if ( !$open && !$close )
{
if ( $tmp_key == '0' )
$tmp[$tmp_key] = ' ( '. $tmp_value;
else
{
if ( ( $tmp_key - 2 ) <= 0 )
$tmp[0] = ' ( '.$tmp[0];
else
$tmp[ $tmp_key - 2 ] = $tmp[ $tmp_key - 2 ].' ( ';
}

$open = true;
$close = false;
}
}


if ( preg_match('~[\+\-]~', $tmp_value ) && $open && !$close )
{
$tmp[ $tmp_key] = ' ) '.$tmp[ $tmp_key];
$open = false;
$close = false;
}

if ( $open && !$close && $tmp_key == $tmp_count )
{
$tmp[$tmp_key] = $tmp_value.' ) ';
$open = false;
$close = false;
}
}

return trim( preg_replace( '~\s\s+~', ' ', implode( ' ', $tmp ) ) );
}


Вот все же накатал, для визуализации скобок, по приоритету выполнения математических операций. Может коряво конечно ), но вроде работает, кто хочет/может, допилите если есть желание B)

Спустя 7 минут, 42 секунды (9.12.2011 - 16:10) Winston написал(а):
Монстр biggrin.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.