2011-04-27 23 views
6

Estoy trabajando en un proyecto en el que necesito hacer una función que analizará las 4 operaciones matemáticas predeterminadas (suma, resta, multiplicación, división). Sería bueno si la función pudiera analizar las operaciones entre paréntesis.Analizar operaciones matemáticas con PHP

Entonces, una función imprescindible es que la función compruebe primero las operaciones de multiplicación y división (debería verificar eso después de analizar todas las operaciones entre corchetes si existen, y esa regla debería aplicarse para las operaciones de corchetes [el mayor problema es que los corchetes pueden contener corchetes]). Después de hacer todas las operaciones de multiplicación y división, debe hacer todas las operaciones de suma y resta. El número final debe ser devuelto por funciones.

Otra buena adición sería una cadena RegExp que verificará las operaciones matemáticas.

¡Gracias de antemano!

+2

Para su problema de paréntesis: debe aprender la recursión para aprender la recursión –

+0

La 'pregunta' comienza con 'Estoy trabajando en un proyecto' pero rápidamente se convierte en una lista de deseos de funciones. – pavium

+2

Me parece un problema de tarea. ¿Es esto un problema de tarea? – KyleWpppd

Respuesta

4

Esto debe ser bastante segura:

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

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

¿Qué debería cambiar si también tengo que admitir números flotantes? / –

3

Puede usar eval() () ADVERTENCIA: asegúrese de que lo que ingresa es una operación matemática y no otra entrada arbitraria o código php).

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

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

echo "The result is $result"; 
+0

Me pregunto si sería posible hacer un eval() 100% seguro para las expresiones matemáticas si se buscara algún caracter no reconocido; es decir 'preg_replace ('~ [^ 0-9.() - + * /] ~', '', $ input);' – Martijn

+0

@Martijn probablemente eso funcionaría, y es el método utilizado también en la respuesta aceptada. –

0

Las expresiones regulares no son la respuesta aquí; Sugiero usar un expression tree donde todos los nodos terminales son constantes o variables, y el resto de los nodos son operadores. Por ejemplo, 2 + 3 * 4 se convierte en:

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

A continuación, se evalúa la expresión mediante el uso de un depth-first traversal. En PHP es un poco difícil representar árboles, pero podría usar una biblioteca incorporada como sugirió un comentarista o representarlos usando una matriz asociativa de matrices.

0

si quieres un verdaderamente seguro analizador matemático, luego eval no lo hará. bcParserPHP puede hacerlo. Está implementado en PHP y no usa eval, por lo tanto es muy seguro.