Ich wurde beauftragt, einige Bedingungen in einer Anwendung zu aktualisieren. Ich habe einen Datensatz, der ausgewertet werden soll, und er wurde in der Anwendung folgendermaßen fest codiert:
$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;
und so weiter...
Es ist ein Albtraum, an vielen Orten aufrechtzuerhalten.
Was ich im Wesentlichen suche, ist eine Möglichkeit, eine Abfragezeichenfolge zu übergeben, um Daten auszuwerten. Zu Beginn könnte eine einfache Formel als Array definiert werden
$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]);
}
}
Dies könnte dann erweitert und rekursiv aufgerufen werden
$formula = [['a','=','apple'], 'AND', ['e','<','10']]
aber was ich im Wesentlichen suche, ist, Formeln aa Zeichenfolge zu speichern, wie:
"((([a]="orange") OR ([c]<"4")) AND ([g]="red"))"
wo [] würde Array-Schlüssel identifizieren
oder vielleicht so etwas wie in Excel
"AND(OR(IF('a'='orange'),IF('c'<4)),IF('g'='red'))"
Gibt es dafür eine saubere Lösung? Ich habe eine Idee, wie ich vielleicht in Zukunft eine ganze Bibliothek dafür bauen kann.
Ich möchte dem Code nicht jedes Mal neue Bedingungen hinzufügen. Sie sind bereits überall in der Anwendung. Es ist besser, es in der Konfiguration zu speichern und an einem Ort zu erweitern oder zu ändern.
Jede Hilfe sehr geschätzt.
eval()
.Antworten:
Das ist also nur eine schnelle Lösung, funktioniert aber gerade für mich.
Wenn die Formel [a] enthält, wird sie als Array-Schlüssel behandelt.
In dieser Lösung funktioniert es mit folgenden Formeln:
Es ist nicht genau das, was ich wollte, aber es macht den Job und ist nicht so schrecklich (hoffe ich). Es bedarf einiger Eingangsüberprüfungen und Fehlerbehandlungen, dies ist jedoch nur ein Beispiel.
quelle