8791 sujets

Développement web côté serveur, CMS

Bonjour,

Je suis en train de coder un truc assez complexe avec de nombreuses fonction mathématiques et je souhaiter stocker mes opérations dans une la variable ... mais avant ... est-ce envisageable ?


$cont = 0;
$var = array(
  array('+', 2),
  array('*', 3)
);
foreach ($var as $v){
  $cont = $cont .$v[0]. $v[1];
}
echo $cont;



Vous vous doutez bien que ceci ne peut fonctionner, la concaténation créant une chaine !
et que mon problème est bien plus complexe en quantité de données et d'opérations ...

Mais quelqu'un as t il déjà résolu un tels problème ?

Merci Bien d'avance Smiley cligne
Modifié par Nours312 (01 Apr 2009 - 10:42)
Salut,

pour ce qui est de l'interprétation des variables dans une string tu aurais pu regarder du côté de eval mais ça ne fonctionnera pas pour les opérateurs.

Du coup je ne vois que quelque chose comme :
<?php
$cont = 0;
$var = array(
	array('+', 2),
	array('*', 3)
);

foreach ($var as $v){
	switch($v[0]) {
		case '+' :
		$cont = $cont + $v[1];
		break;
		case '-' :
		$cont = $cont - $v[1];
		break;
		case '*' :
		$cont = $cont * $v[1];
		break;
		case '/' :
		$cont = $cont / $v[1];
	}
}
echo '<p>'.$cont.'</p>';
?>
Merci Heyoan, j'avais testé eval, mais sans succès ni conviction

J'avais plus envisagé une fonction indépendante car en réalité j'ai entre 3 et 5 paramètres, avec pour entre 1 et 5 opérateurs ....

mais ce qui me gène c'est que ces paramètres sont variables ... au sein même des boucles

Au global je génère environs 20 000 boucles ... et j'ai peur que cette fonction externalisée me plombe les performance d'optimisation déployée tout au long du script ....

il faut que je fasse des tests peut-etre qu'en remplaçant les opérateurs par de function uniques, je gagnerais en optimisation ....


Qu'en penses-tu ?

c'est une idée en direct live :


<?php

$cont = 0;
$var = array(
	array('p', 2),
	array('f', 3)
);
function p($a, $b){
  return $a+$b;
}
function f($a, $b){
  return $a*$b;
}

foreach ($var as $v){
  $cont = {$v[0]}($cont,  $v[1]);
}

echo '<p>'.$cont.'</p>';

?>



cela serait peut-être le plus optimisé ... non ?

les x critères pourrait etre quantifié grace à un étage supplémentaire du tableau

Bon, donnes moi un avis sur cette solution, .. je commence à coder en ce sens et suivant je donnerais une analyse ... ou tout du moins un exemple plus concret !..

@+ Merci Smiley cligne
Modifié par Nours312 (31 Mar 2009 - 20:00)
Nours312 a écrit :
cela serait peut-être le plus optimisé ... non ?
A dire vrai je n'en ai pas la moindre idée ! Smiley langue

Ou plutôt il m'a semblé que le switch irait plus vite mais en fait la seule façon de le savoir serait de faire un benchmark avec les 2 solutions...
Bon ben ça à l'air de se confirmer pour le switch :
<?php
function p($a, $b) {
	return $a + $b;
}
function m($a, $b) {
	return $a - $b;
}
function f($a, $b) {
	return $a * $b;
}
function d($a, $b) {
	return $a / $b;
}
$var = array(
	array('p', 5),
	array('m', 1),
	array('f', 3),
	array('d', 2)
);

$nb_occur = 100000;

// 1er test
$time_start = microtime(true);
$cont = 0;
for($i = 0; $i < $nb_occur; $i++) {
	foreach ($var as $v){
		switch($v[0]) {
			case 'p' :
			$cont = $cont + $v[1];
			break;
			case 'm' :
			$cont = $cont - $v[1];
			break;
			case 'f' :
			$cont = $cont * $v[1];
			break;
			case 'd' :
			$cont = $cont / $v[1];
		}
	}
	reset($var);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "<p>Durée 1er test : ".$time.' secondes</p>';

// 2ème test
$time_start = microtime(true);
$cont = 0;
for($i = 0; $i < $nb_occur; $i++) {
	foreach ($var as $v){
		$cont = $v[0] ($cont,  $v[1]);
	}
	reset($var);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "<p>Durée 2ème test : ".$time.' secondes</p>';
?>
Merci Bien Heyoan pour ce temps consacré ....

le soucis étant que mes éléments sont nombreux, dispersé, .... le switch ne peux etre placé en l'état je vais pourrir le code ! :s donc, en le plaçant dans une fonction, cela prend 2 foisplus plus de temps ....

Bon, je vais resté sur l'idée des fonctions individuelles ...

Merci, Si je trouve Mieux, je vous informe !! @+
Ah si :

Crois tu qu'il serait plus rapide de laisser ces fonctions indépendante ou intégrée à mon objet ?

évidement, ma boucle étant dans une fonction d'un objet, est-il préférable de les laisser purement indépendante ? ou peut-on gagner du temps avec $this->{$v[0]}($cont, $v[1])

a tout hasard Smiley cligne

Merci :d
Salut :
Bon, j'ai pas fait de tests en incluant les fonctions dans l'objet, mais par contre

eval() fonctionne et plutôt correctement !!! j'avais essayé sans succès, mai mal il semblerait ....

J'en ai profité pour comparer la vitesse de traitement, et c'est 10 Fois plus long que le principe des fonctions ....

Donc, j'en reste là !

Il semblerait que le système supporte ! .... Donc, Merci & BonCode Smiley cligne