Tôi được giao nhiệm vụ cập nhật một số điều kiện trong một ứng dụng. Tôi có một bộ dữ liệu được đánh giá và nó đã được mã hóa cứng trong ứng dụng theo cách sau:
$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;
và như thế...
Đó là một cơn ác mộng để duy trì ở nhiều nơi.
Những gì tôi về cơ bản đang tìm kiếm là thực hiện một số cách để vượt qua trong chuỗi truy vấn để đánh giá dữ liệu. Để bắt đầu, một công thức đơn giản có thể được định nghĩa là một mảng
$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]);
}
}
Điều này sau đó có thể được mở rộng và được gọi đệ quy
$formula = [['a','=','apple'], 'AND', ['e','<','10']]
nhưng điều tôi chủ yếu tìm kiếm là lưu trữ công thức chuỗi aa, như:
"((([a]="orange") OR ([c]<"4")) AND ([g]="red"))"
trong đó [] sẽ xác định các khóa mảng
hoặc có thể một cái gì đó giống như trong Excel
"AND(OR(IF('a'='orange'),IF('c'<4)),IF('g'='red'))"
Có bất kỳ giải pháp sạch để làm điều này? Tôi có một ý tưởng làm thế nào để xây dựng toàn bộ thư viện cho nó, có thể trong tương lai.
Tôi không muốn thêm điều kiện mới vào mã mỗi lần. Họ đã có tất cả các ứng dụng. Sẽ tốt hơn để lưu trữ nó trong cấu hình và mở rộng hoặc sửa đổi ở một nơi.
Bất kỳ trợ giúp nhiều đánh giá cao.
eval()
.