2+2*2, должно получиться 6ть, а не 8мь.
2 + ( 2*2 ) = 6 - Верно, т.к. сначала делается умножение/деление, а уж потом плюс/минус.
2 + 2*2 = 8 - НЕ Верно.
Вот и хочется определить что первоначально делать, а что потом.
Никогда с таким не сталкивался, мб есть функции какие либо или все же придется парсить всю строку, и уже от составляющих плясать ?

Спустя 13 минут, 57 секунд (9.12.2011 - 13:52) Семён написал(а):
У тебя по математике 2-йка была?
2+2*2 оно и получается у всех нормальных людей 6, а не 8.
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, умножение выполняется первым действием по мат. правилам.
Тебе нужно, чтобы скрипт специально для даунов заключал в скобки операции с умножением или извиняюсь за грубость ты просто такой.

Спустя 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
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. Мне нужен именно результат, а не "вид" вычисления...
Я так понял что 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 написал(а):
Всем плюсанул
, я как обычно создаю себе лишнюю работу ), всем спасибо !

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

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

Спустя 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 написать чтобы не создавать переменную
если уж через 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 написал(а):
Монстр
