Calcul arithmétique

Exemple: 5+6-2*(5/2)

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je cherche à obtenir le résultat d'une addition entrée dans 1 seul input.

J'ai fait un début de fonction:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
function calcul(){

            $mystring = $_POST['expression'];

            if(strpos($mystring, '+')){
                $addition = explode('+', $mystring);
                $resultat = $addition[0] + $addition[1];

            }

            echo $resultat;

        }
?>

Le problème avec cette fonction c'est que ça marche très bien pour par exemple 5+5, 108+3 ou encore 24+8, mais ça ne peut pas marcher pour 5+3+7 ou 12+47+3, etc, …

Voilà, si vous avez des idées pour améliorer la fonction ou des pistes à me donner :)

Édité par anonyme

+0 -0
Staff

tu peux faire un array_map avec une closure ou bien un un simple foreach :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
//version simple avec foreach
function calcul(){
   $mystring = $_POST['expression'];
   if(strpos($mystring, '+')){
        $addition = explode('+', $mystring);
        $resultat = 0;
        foreach($addition as $nombre){
            $resultat += $nombre
        }
    }

    echo $resultat;
}

}

Édité par artragis

+0 -0
Auteur du sujet

Oui effectivement c'est pas bête merci

PS: Attention tu as oublié un ; à la ligne 9 ;)

EDIT: Une idée pour inclure les - ? Pour faire par exmple: 5-3+2

Édité par anonyme

+0 -0
Auteur du sujet

Au final j'aimerais que la fonction puisse calculer une fonction arithmétique du genre (5+2-1*3)/2

J'avoue que je coince pas mal… :(

C'est néanmoins une bonne idée pour le str_replace($mystring,"-","+-");

Édité par anonyme

+0 -0
Staff

Ton problème c'est que tu y vas dans le mauvais sens. des calculs "arithmétiques" de ce genre là faut les interpréter et c'est bien plus complexe qu'un simple "explode".

Il faut réussir créer un arbre pour faire les opérations dans le bon sens, exécuter les opérations et les résoudre.

Pour l'opération (5+2-1*3)/2, l'arbre serait :

1
2
3
4
5
6
                         /
          (5+2-1*3)              2
             - 
     5+2         1*3
      +           *
   5     2     1    3

du coup, théoriquement, il va faire

5+2 = 7 1*3 = 3 puis il va remonter la valeur et faire 7 - 3 = 4 puis il va remonter la valeur et faire 4/2 = 2 il va remonter la valeur, et comme c'est la fin, il affiche cette valeur.

Et là ça te demandera de faire un peu de conception.

Il me semble qu'en PHP, tu as HOA qui te permet de faire de base ce genre de chose, mais je pense que ce n'est pas ton but de l'utiliser, non?

+0 -0
Staff

A-312 : mais est-ce vraiment la réponse à la question de notre ami?

Les bibliothèques (je n'aime pas qu'on dise librairie, library, ou bibliothèque, oui, mais pas librairie) que j'ai cité telles que HOA possèdent un moteur safe et bien plus complet que eval.

Pour autant, je ne suis certain que le but de Maathieu n'est pas d'apprendre à utiliser une lib. Au contraire j'ai l'impression qu'il cherchait à coder une forme simple de calculatrice. Faire un eval c'est juste "ok, j'ai pas envie d'aller comprendre, je fais le truc crade et j'ai mon résultat".

Que ça soit en php ou en js, eval c'est pas une bonne pratique. La fonction existe uniquement pour les edge cases et faire une calculatrice n'en est pas un !

A mon sens, implémenter l'algorithme de Shunting Yard ou bien faire un truc perso qui ne supporte que les parenthèses, l'addition, la soustraction, la multiplication et la division c'est bien plus formateur d'une part et d'autre part c'est aussi bien plus "safe" qu'un eval mal foutu.

+0 -0

Hello,

1
2
3
<?php

$result = false !== strpos('+', $_POST['expression']) ? array_sum(explode('+', $_POST['expression'])) : $_POST['expression'];

Ne pas s'emmerder à déclarer une fonction pour ça, et faire le tout en une ligne (grosso merdo). Et ne pas s'emmerder à implémenter un algo quand le truc demandé est tout con. Après s'il veut pousser, oui faut partir dessus…

"Meh." Outil de diff PHP : Totem

+1 -1
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte