Saya ditugaskan untuk memperbarui beberapa kondisi dalam suatu aplikasi. Saya memiliki satu set data untuk dievaluasi, dan telah di-hard-coded dalam aplikasi dengan cara berikut:
$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;
dan seterusnya...
Ini adalah mimpi buruk untuk dipertahankan di banyak tempat.
Apa yang saya cari pada dasarnya adalah membuat beberapa cara untuk mengirimkan string kueri untuk mengevaluasi data. Untuk memulai formula sederhana dapat didefinisikan sebagai array
$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]);
}
}
Ini kemudian dapat diperpanjang dan disebut secara rekursif
$formula = [['a','=','apple'], 'AND', ['e','<','10']]
tetapi apa yang saya cari pada dasarnya adalah untuk menyimpan formula aa string, seperti:
"((([a]="orange") OR ([c]<"4")) AND ([g]="red"))"
di mana [] akan mengidentifikasi kunci array
atau mungkin sesuatu seperti di Excel
"AND(OR(IF('a'='orange'),IF('c'<4)),IF('g'='red'))"
Apakah ada solusi bersih untuk melakukan ini? Saya punya ide bagaimana membangun seluruh perpustakaan untuk itu, mungkin di masa depan.
Saya tidak ingin menambahkan ketentuan baru ke kode setiap waktu. Mereka sudah ada di seluruh aplikasi. Akan lebih baik untuk menyimpannya dalam konfigurasi dan memperluas atau memodifikasi di satu tempat.
Setiap bantuan sangat dihargai.
eval()
.