Accueil > > > FONCTION EQUATION LÉGÈRE
FONCTION EQUATION LÉGÈRE
Information sur la source
Description
Fonction equation en 50 lignes de code. Prend une équation (string $equation) en paramètre (ex.: 5+5*300/2-50) et renvoie le résultat en prenant en compte les priorités, en analysant la chaîne peu importe sa longueur et peu importe les espacements (ex.: 2 + 2 *4 / 4). Je ne voulais pas utiliser eval(), en contexte web, j'aime mieux ne pas activer la fonction dans PHP. Exemple d'utilisation :
->copier/coller code source<-
echo equation("10+2");
Source
- <?php
- function operation($a,$b,$c) {
- switch($b) {
- case '+': return $a + $c; break;
- case '-': return $a - $c; break;
- case '*': return $a * $c; break;
- case '/': return $a / $c; break;
- } }
- function equation($equation) {
- $input = str_replace(' ','',trim($equation));
- $caracteres = preg_split('//',$input,-1,PREG_SPLIT_NO_EMPTY);
- for($i=0;$i<count($caracteres);$i++) {
- if(!is_numeric($caracteres[$i])) {
- $operateurs[].= $caracteres[$i];
- $nb .= ' ';
- } else {
- $nb .= $caracteres[$i];
- } }
- $nombres = explode(' ',$nb);
- for($i=0;$i<count($operateurs);$i++) {
- if($operateurs[$i] == "*" || $operateurs[$i] == "/") {
- if($operateurs[$i-1] == "*" || $operateurs[$i-1] == "/") {
- $last = count($nouv_eq) - 1;
- $nouv_eq[$last] = operation($nouv_eq[$last],$operateurs[$i],$nombres[$i+1]);
- } else {
- $nouv_eq[] .= operation($nombres[$i],$operateurs[$i],$nombres[$i+1]);
- }
- } else {
- if($operateurs[$i-1] != "*" && $operateurs[$i-1] != "/") $nouv_eq[] .= $nombres[$i];
- $nouv_eq[] .= $operateurs[$i];
- if($i == count($operateurs)-1) $nouv_eq[] .= $nombres[$i+1];
- } }
- for($i=0;$i<count($nouv_eq);$i++) {
- if(!is_int($i / 2)) $nouv_operateurs[] .= $nouv_eq[$i];
- else $nouv_nombres[] .= $nouv_eq[$i];
- }
- if(count($nouv_operateurs) > 0) {
- for($i = 0;$i<count($nouv_operateurs);$i++) {
- if($i == 0) $rslt = operation($nouv_nombres[0],$nouv_operateurs[0],$nouv_nombres[1]);
- else $rslt = operation($rslt,$nouv_operateurs[$i],$nouv_nombres[$i+1]);
- } }
- else {
- $rslt = $nouv_nombres[0];
- }
- return $rslt;
- }
- ?>
<?php
function operation($a,$b,$c) {
switch($b) {
case '+': return $a + $c; break;
case '-': return $a - $c; break;
case '*': return $a * $c; break;
case '/': return $a / $c; break;
} }
function equation($equation) {
$input = str_replace(' ','',trim($equation));
$caracteres = preg_split('//',$input,-1,PREG_SPLIT_NO_EMPTY);
for($i=0;$i<count($caracteres);$i++) {
if(!is_numeric($caracteres[$i])) {
$operateurs[].= $caracteres[$i];
$nb .= ' ';
} else {
$nb .= $caracteres[$i];
} }
$nombres = explode(' ',$nb);
for($i=0;$i<count($operateurs);$i++) {
if($operateurs[$i] == "*" || $operateurs[$i] == "/") {
if($operateurs[$i-1] == "*" || $operateurs[$i-1] == "/") {
$last = count($nouv_eq) - 1;
$nouv_eq[$last] = operation($nouv_eq[$last],$operateurs[$i],$nombres[$i+1]);
} else {
$nouv_eq[] .= operation($nombres[$i],$operateurs[$i],$nombres[$i+1]);
}
} else {
if($operateurs[$i-1] != "*" && $operateurs[$i-1] != "/") $nouv_eq[] .= $nombres[$i];
$nouv_eq[] .= $operateurs[$i];
if($i == count($operateurs)-1) $nouv_eq[] .= $nombres[$i+1];
} }
for($i=0;$i<count($nouv_eq);$i++) {
if(!is_int($i / 2)) $nouv_operateurs[] .= $nouv_eq[$i];
else $nouv_nombres[] .= $nouv_eq[$i];
}
if(count($nouv_operateurs) > 0) {
for($i = 0;$i<count($nouv_operateurs);$i++) {
if($i == 0) $rslt = operation($nouv_nombres[0],$nouv_operateurs[0],$nouv_nombres[1]);
else $rslt = operation($rslt,$nouv_operateurs[$i],$nouv_nombres[$i+1]);
} }
else {
$rslt = $nouv_nombres[0];
}
return $rslt;
}
?>
Historique
- 18 mai 2009 01:23:48 :
- rien
- 18 mai 2009 01:33:11 :
- --
- 18 mai 2009 01:34:52 :
- -
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Calcul litéral Math [ par piep14 ]
Bonjour le forum, je souhaite mettre en place un système de calcul assez simple pour commencer. Exemple, je met 2+5 dans un input, il me renvoie
calcul plutôt compliqué... non ? [ par emilyfr ]
Bonjour,Je viens vous demander un petit coup de pouce pour un calcul... vu que je suis nulle en maths et que rien qu'à l'imaginer, j'ai mal à la tête.
Eval et boucle [ par darkduck ]
Bonjour,J'utilise la méthode suivante :$affichage = 'je coute $prix euros';for ($i=1; $i<5; $i++){ $prix = $i; eval("\$affichage = \"$aff
Math de bon niveau [ par rambc ]
Bonjour,je souhaite développer des outils permettant de faire des Maths de bon niveau. J'ai entendu parler de BCMath. Existe-t-il une docu complète su
Calcul du timeout client [ par callman ]
Bonjour à tous,Voila, j'ai un problème avec un soft sur un timeout.En fait, des clients se connectent à un site pour obtenir des états.Beaucoup d'entr
Besoin de conseil pour un calcul svp ! [ par demonn ]
Bonjour à tous,voilà je voudrais développer un jeux.Un amis fait la section flash et moi je dois m'occuper du calcul du jeux.seulement j'aurais voulu
Calcul de durée [ par nono52 ]
Je suis débutant et je cherche à réaliser une calcul de durée.Avec un formulaire j'envoie dans une table un numéro de vol et une durée concernant une
Accès site avec calcul d'âge [ par Tanaka56 ]
Bonjour a tous.Je voudrais trouver un script pour faire un accès sur une page en fonction de l'âge (18) donc demander la date de naissance dans un pet
calcul de champs selon coefficient... [ par cyse ]
Bonjour,C'est pas evident à expliquer, mais surement assez simple a ecrire en php... J'aimerais, qu'un code php recupere les données (numériques) x y
calcul matriciel en php [ par cacoucatatonique ]
bonjour à tous,je suis à la recherche d'un code d'exemple pour effectuer des calculs matriciels de dimension variable, j'ai un peut recherche sur le n
|
Derniers Blogs
L'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIESL'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIES par odewit
La tendance est aux interfaces naturelles (NUI), et le keynote de Bill Buxton au MIX l'a bien souligné.
La charte graphique et ergonomique de Windows Phone 7 a donc été entièrement repensée en vue d'obtenir un maximum d'efficacité sur ce point. En re...
Cliquez pour lire la suite de l'article par odewit COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|