J'ai été chargé de mettre à jour certaines conditions dans une application. J'ai un ensemble de données à évaluer, et il a été codé en dur dans l'application de la manière suivante:
$arr = array(
'a' => 'apple',
'b' => 'orange',
'c' => 1,
'd' => 2,
'e' => 5,
'f' => 'green',
'g' => 'red',
'h' => 'yellow',
)
$res1 = ($arr['a'] == 'apple') ? TRUE : FALSE;
$res2 = (($arr['b'] == $arr['f']) && ($arr['c'] < $arr['d']) ? TRUE : FALSE;
$res3 = (($arr['e'] == '5') && $res2) ?TRUE : FALSE;
etc...
C'est un cauchemar à entretenir dans de nombreux endroits.
Ce que je recherche essentiellement, c'est de trouver un moyen de passer la chaîne de requête pour évaluer les données. Pour commencer, une formule simple pourrait être définie comme un tableau
$formula = ['a', '=', 'apple'];
function query($formula, $arr) {
switch ($formula[1]) {
case '=':
return ($arr[$formula[0]] == $formula[2]);
case '!=':
return ($arr[$formula[0]]!= $formula[2]);
case '>':
return ($arr[$formula[0]] > $formula[2]);
case '<':
return ($arr[$formula[0]] == $formula[2]);
}
}
Cela pourrait alors être étendu et appelé récursivement
$formula = [['a','=','apple'], 'AND', ['e','<','10']]
mais ce que je recherche essentiellement, c'est de stocker des formules sous forme de chaîne, comme:
"((([a]="orange") OR ([c]<"4")) AND ([g]="red"))"
où [] identifierait les clés du tableau
ou peut-être quelque chose comme dans Excel
"AND(OR(IF('a'='orange'),IF('c'<4)),IF('g'='red'))"
Existe-t-il une solution propre pour ce faire? J'ai une idée de comment construire une bibliothèque entière pour cela, peut-être à l'avenir.
Je ne veux pas ajouter de nouvelles conditions au code à chaque fois. Ils sont déjà partout dans l'application. Il serait préférable de le stocker dans la configuration et de l'étendre ou de le modifier en un seul endroit.
Toute aide très appréciée.
eval()
.Réponses:
Ce n'est donc qu'une solution rapide, mais fonctionne pour moi en ce moment.
S'il y a [a] dans la formule, il sera traité comme une clé de tableau.
Dans cette solution, il fonctionnera avec une formule comme:
Ce n'est pas exactement ce que je voulais, mais fait le travail, et ce n'est pas si terrible (j'espère). Il a besoin d'une vérification d'entrée et d'une gestion des erreurs, mais ce n'est qu'un exemple.
la source