Fonction equation légère


Contenu du snippet

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 / Exemple :


<?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;
}
?>

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.