Fui encarregado de atualizar algumas condições em um aplicativo. Eu tenho um conjunto de dados a ser avaliado e foi codificado no aplicativo da seguinte maneira:
$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;
e assim por diante...
É um pesadelo para manter em muitos lugares.
O que eu estou procurando, essencialmente, é fazer alguma maneira de passar na string de consulta para avaliar os dados. Para iniciar, uma fórmula simples pode ser definida como uma matriz
$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]);
}
}
Isso poderia ser estendido e chamado recursivamente
$formula = [['a','=','apple'], 'AND', ['e','<','10']]
mas o que eu estou procurando essencialmente é armazenar fórmulas e uma string, como:
"((([a]="orange") OR ([c]<"4")) AND ([g]="red"))"
onde [] identificaria chaves de matriz
ou talvez algo como no Excel
"AND(OR(IF('a'='orange'),IF('c'<4)),IF('g'='red'))"
Existe alguma solução limpa para fazer isso? Eu tenho uma idéia de como construir uma biblioteca inteira para ela, talvez no futuro.
Não quero adicionar novas condições ao código todas as vezes. Eles já estão em todo o aplicativo. Seria melhor armazená-lo na configuração e estender ou modificar em um só lugar.
Qualquer ajuda muito apreciada.
eval()
.Respostas:
Portanto, essa é apenas uma solução rápida, mas funciona para mim agora.
Se houver [a] na fórmula, ela será tratada como chave de matriz.
Nesta solução, ele funcionará com fórmula como:
Não é exatamente o que eu queria, mas faz o trabalho e não é tão terrível (espero). Ele precisa de alguma verificação de entrada e tratamento de erros, mas este é apenas um exemplo.
fonte