2011-04-27 4 views
6

Je travaille sur un projet où je dois faire une fonction qui va analyser les 4 opérations mathématiques par défaut (addition, soustraction, multiplication, division). Ce serait bien si la fonction pouvait analyser les opérations entre parenthèses. Donc, un must est que la fonction vérifie d'abord pour les opérations de multiplication et de division (devrait vérifier qu'après avoir analysé toutes les opérations entre parenthèses si elles existent, et cette règle devrait s'appliquer pour les opérations de support [le plus gros problème est que le les crochets peuvent contenir des crochets]). Après avoir fait toutes les opérations de multiplication et de division, il devrait effectuer toutes les opérations d'addition et de soustraction. Le nombre final devrait être retourné par des fonctions.Analyser les opérations mathématiques avec PHP

Une autre belle addition serait une chaîne RegExp qui vérifiera les opérations mathématiques.

Merci d'avance!

+2

Pour votre problème parenthèse: vous devriez apprendre la récursivité pour apprendre la récursivité –

+0

La 'question' commence par "Je travaille sur un projet" mais devient rapidement une liste de fonctionnalités. – pavium

+2

Sonne comme un problème de devoirs pour moi. Est-ce un problème de devoirs? – KyleWpppd

Répondre

4

Cela devrait être assez sûr:

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

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

que devrais-je changer si je dois aussi prendre en charge les nombres flottants? / –

3

Vous pouvez utiliser eval() (AVERTISSEMENT: assurez-vous que ce qui entre est une opération mathématique et non une autre entrée arbitraire ou un code php).

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

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

echo "The result is $result"; 
+0

Je me demande s'il serait possible de faire un eval() 100% sûr pour les expressions mathématiques si vous deviez vérifier tout caractère non reconnu; c'est-à-dire 'preg_replace ('~ [^ 0-9.() - + * /] ~', '', $ input);' – Martijn

+0

@Martijn probablement cela fonctionnerait, et c'est aussi la méthode utilisée dans la réponse acceptée. –

0

Les expressions régulières ne sont pas la réponse ici; Je suggère d'utiliser un expression tree où tous les nœuds terminaux sont des constantes ou des variables, et le reste des nœuds sont des opérateurs. Par exemple, 2 + 3 * 4 devient:

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

Ensuite, vous évaluer l'expression en utilisant un depth-first traversal. En PHP, il est assez difficile de représenter les arbres, mais vous pouvez soit utiliser une bibliothèque intégrée en tant qu'intermédiaire proposée, soit les représenter en utilisant un tableau associatif de tableaux.

0

si vous voulez un vraiment sûr analyseur mathématique, alors eval ne le fera pas. bcParserPHP peut le faire. Il est implémenté en PHP et n'utilise pas eval, donc il est très sécurisé.

Questions connexes