Code : Tout sélectionner
//ETABLI LA CONNEXION
Global $conn;
//RECUPERE LA FORMULE ET LE DERNIER PRIX
$Libelle_Revalorisation = 'ICHTTS1,+,0.15,*,PSDC';
$P = 100;
//TRAITEMENT DE LA FORMULE
$Formule = $Libelle_Revalorisation;
$Variable = explode(",", $Formule);
//COMPTE LE NOMBRE DE VARIABLE DANS LA FORMULE
$Nbre_Variable = count($Variable);
//TRAITEMENT DES DATES
//Extrait le jour et le mois de la date du mois de revalorisation
$Date_Indice_Mois = 1;
$Jour = 1;
$Mois_Date_Indice_Mois = $Date_Indice_Mois;
//DEFINI L ANNEE
$Annee = date("y");
$Annee_1 = $Annee - 1;
$Annee_2 = $Annee_1 - 1;
$Date_1 = mktime(0, 0, 0, date($Mois_Date_Indice_Mois), date($Jour), date($Annee_1));
$Date_2 = mktime(0, 0, 0, date($Mois_Date_Indice_Mois), date($Jour), date($Annee_2));
$Date_Form_1 = "'".date("Y-m-d",$Date_1)."'";
$Date_Form_2 = "'".date("Y-m-d",$Date_2)."'";
//COMPTE LE NOMBRE D INDICE DIFFERENT DANS LA TABLE INDICE
$sSqlWrk = " SELECT DISTINCT
Libelle
FROM indice";
$rswrk = $conn->GetArray($sSqlWrk);
$Nbre = count($rswrk);
//______________________________________________
//CREE UNE BOUCLE POUR AFFECTER LES COEFS
for($i=0;$i < $Nbre_Variable ;$i++)
{
for($j=0;$j < $Nbre ;$j++)
{
$tableau = $rswrk[$j] ['Libelle'];
$Var = $Variable[$i];
//RECUPERE LES VALEURS DES INDICES
$sSqlWrk = "SELECT
Valeur
FROM
indice
WHERE
Libelle = '$Var' AND
Date = $Date_Form_1";
$rswrk = $conn->GetArray($sSqlWrk);
$Indice_1 = $rswrk[0] ['Valeur'];
$sSqlWrk2 = "SELECT
Valeur
FROM
indice
WHERE
Libelle = '$Var' AND
Date = $Date_Form_2";
$rswrk2 = $conn->GetArray($sSqlWrk2);
$Indice_2 = $rswrk2[0] ['Valeur'];
//____________________________A COMPLETER A CHAQUE NOUVEL INDICE
//CALCUL LE COEF DE ICHTTS1
IF ($Var == 'ICHTTS1')
{
$ICHTTS1 = round($Indice_1/$Indice_2, 4);
}
//CALCUL LE COEF DE PSDC
IF ($Var == 'PSDC')
{
$PSDC = round($Indice_1/$Indice_2, 4);
}
}//FIN DE FOR $Nbre
}//FIN DE FOR $Nbre_Variable
//____________________________A COMPLETER A CHAQUE NOUVEL INDICE
//REMPLACE LES VARIABLES PAR LES COEFS
$patterns[0] = '/ICHTTS1/';
$patterns[1] = '/PSDC/';
$patterns[2] = '/,/';
$replacements[2] = $ICHTTS1;
$replacements[1] = $PSDC;
$replacements[0] = '';
//REALISE LE CALCUL DE LA FORMULE
$Calcul = preg_replace($patterns, $replacements, $Libelle_Revalorisation);
eval('$resultat = '.$Calcul.';');
$Nouveau_Prix = $P*$resultat;
echo $resultat.'<br>';
echo $Nouveau_Prix.'<br>';
$operation = new mult(
new variable('prix'),
new div(
new indice(
'ichtts',
new variable('date')
),
new indice(
'ichtts',
new sous(new variable('date'), 1)
)
)
);
Et pour l'implémentation j'aurais fait une classe abstraite que j'aurais implémenté ainsi :abstract class fonction
{
private $args = array();
public function __construct()
{
$this->args = func_get_args();
}
public function resultat()
{
$resultats = array()
foreach($args as $arg)
{
if($arg instanceof fonction)
{
$resultats[] = $arg->resultat();
}
else
{
$resultats[] = $arg;
}
}
return call_user_func_array(array($this, 'calcul'), $resultats);
}
}
Un exemple de classe :class indice
{
public function calcul($indice, $date)
{
// On récupère l'indice $indice à la date $date
}
}
Pour stocker l'opération dans une chaine on fait :
$chaine = serialize($operation);
Pour la décoder :
$operation = deserialize($chaine);
Pour l'exécuter :
$resultat = $operation->resultat();