2011-04-27 20 views
6

Я работаю над проектом, где мне нужно создать функцию, которая будет анализировать 4 математические операции по умолчанию (сложение, вычитание, умножение, деление). Было бы неплохо, если бы функция могла анализировать операции между скобками.Выполнить математические операции с PHP

Таким образом, обязательным условием является то, что функция сначала проверяет операции умножения и деления (следует проверить это после того, как он проанализирует все операции между скобками, если они существуют, и это правило должно применяться для операций с скобками [самая большая проблема заключается в том, что скобки могут содержать скобки]). После выполнения всех операций умножения и деления он должен выполнять все операции сложения и вычитания. Окончательное число должно быть возвращено функциями.

Другим приятным дополнением будет строка RegExp, которая будет проверять математические операции.

Заранее благодарен!

+2

Для вашей проблемы с круглыми скобками: вы должны изучить рекурсию, чтобы изучить рекурсию. –

+0

«Вопрос» начинается с «Я работаю над проектом», но быстро становится списком желаний. – pavium

+2

Звучит как домашняя проблема для меня. Это домашняя проблема? – KyleWpppd

ответ

4

Это должно быть довольно безопасным:

function do_maths($expression) { 
    eval('$o = ' . preg_replace('/[^0-9\+\-\*\/\(\)\.]/', '', $expression) . ';'); 
    return $o; 
} 

echo do_maths('1+1'); 
+0

что мне нужно изменить, если я тоже должен поддерживать плавающие числа? / –

3

Вы можете использовать eval() (ВНИМАНИЕ: убедитесь, что вводится математическая операция, а не какой-либо другой произвольный ввод или php-код).

$input = "3 + (4 - 2 * 8)/2"; 

eval('$result = ' . $input . ';'); 

echo "The result is $result"; 
+0

Интересно, можно ли сделать eval() на 100% безопасным для математических выражений, если вы хотите проверить какой-либо непризнанный персонаж; то есть 'preg_replace ('~ [^ 0-9.() - + * /] ~', '', $ input);' – Martijn

+0

@Martijn, вероятно, это сработает и будет использоваться также в принятом ответе. –

0

Регулярные выражения здесь не являются ответом; Я предлагаю использовать expression tree, где все терминальные узлы являются константами или переменными, а остальные узлы являются операторами. Например, 2 + 3 * 4 становится:

+ --- 2 
    | 
    --- * --- 3 
     | 
     --- 4 

Затем вычислить выражение, используя depth-first traversal. В PHP сложно представлять деревья, но вы можете использовать встроенную библиотеку в качестве комментатора, предлагаемого или представляющего их, используя ассоциативный массив массивов.

0

если вы хотите по-настоящему безопасным math parser, тогда eval этого не сделает. bcParserPHP может это сделать. Он реализован в PHP и не использует eval, поэтому он очень безопасен.

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