Bir uygulamadaki bazı koşulları güncellemekle görevlendirildim. Değerlendirilecek bir veri setim var ve uygulamada şu şekilde kodlanmıştır:
$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;
ve bunun gibi...
Birçok yerde bakım yapmak bir kabus.
Ne aradığım aslında verileri değerlendirmek için sorgu dizesinde geçmek için bir yol yapmaktır. Başlangıç için basit bir formül dizi olarak tanımlanabilir
$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]);
}
}
Bu daha sonra genişletilebilir ve özyinelemeli olarak adlandırılabilir
$formula = [['a','=','apple'], 'AND', ['e','<','10']]
ama temelde aradığım şey formülleri aa string, saklamak gibi:
"((([a]="orange") OR ([c]<"4")) AND ([g]="red"))"
burada [] dizi anahtarlarını tanımlar
veya Excel'deki gibi bir şey
"AND(OR(IF('a'='orange'),IF('c'<4)),IF('g'='red'))"
Bunu yapmak için temiz bir çözüm var mı? Belki de gelecekte tüm kütüphanenin nasıl yapılacağına dair bir fikrim var.
Her seferinde koda yeni koşullar eklemek istemiyorum. Onlar zaten uygulamanın her yerinde. Konfigürasyonda saklamak ve tek bir yerde genişletmek veya değiştirmek daha iyi olur.
Herhangi bir yardım çok takdir etmek.
eval().