Valutazione del set di dati con una formula di stringa in php

9

Mi è stato chiesto di aggiornare alcune condizioni in un'applicazione. Ho un set di dati da valutare, ed è stato hardcoded nell'applicazione seguente:

$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 così via ...

È un incubo da mantenere in molti posti.

Quello che sto cercando essenzialmente è di fare in modo di passare in stringa di query per valutare i dati. Per iniziare una formula semplice potrebbe essere definita come una matrice

$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]);
    }
}

Questo potrebbe quindi essere esteso e chiamato in modo ricorsivo

$formula = [['a','=','apple'], 'AND', ['e','<','10']]

ma quello che sto cercando essenzialmente è di memorizzare le formule a una stringa, come:

"((([a]="orange") OR ([c]<"4")) AND ([g]="red"))"

dove [] identificherà i tasti dell'array

o forse qualcosa di simile in Excel

"AND(OR(IF('a'='orange'),IF('c'<4)),IF('g'='red'))"

C'è qualche soluzione pulita per fare questo? Ho un'idea di come creare un'intera libreria per questo, forse in futuro.

Non voglio aggiungere nuove condizioni al codice ogni volta. Sono già in tutto l'applicazione. Sarebbe meglio memorizzarlo nella configurazione ed estenderlo o modificarlo in un unico posto.

Qualsiasi aiuto molto apprezzato.

    
posta Pawel Jankowski 23.11.2015 - 13:06
fonte

1 risposta

1

Quindi questa è solo una soluzione rapida, ma funziona per me al momento.

$arr = array('a' => 'red','b' => 'blue');

$formula = ['[a]', '=', 'red'];

Se c'è [a] nella formula verrà trattato come una chiave di array.

function query($formula, $arr) {

    $query_operator=$formula[1];

    if (is_array($formula[0])) {
        //recursive call
        $query_left = query($formula[0], $arr);
    } else {
        //extracting string between brackets
        preg_match("/\[([^\]]*)\]/", $formula[0], $match);
        $query_left = $match ? $arr[($match[1])] : $formula[0];
    }

    if (is_array($formula[2])) {
        //recursive call
        $query_right = query($formula[2], $arr);
    } else {
        //extracting string between brackets
        preg_match("/\[([^\]]*)\]/", $formula[2], $match);
        $query_right = $match ? $arr[($match[1])] : $formula[2];
    }


    switch ($query_operator) {
        case '=':
            return ($query_left == $query_right);
        case '!=':
            return ($query_left != $query_right);
        case '>':
            return ($query_left > $query_right);
        case '<':
            return ($query_left == $query_right);
        case 'AND':
            return ($query_left && $query_right);
        case 'OR':
            return ($query_left || $query_right);
    }
}

In questa soluzione funzionerà con formula come:

$formula = [['[a]', '=', 'red'], 'AND', ['[b]', '=', 'blue']];

Non è esattamente quello che volevo, ma fa il lavoro, e non è così terribile (spero). Ha bisogno di alcuni controlli di input e gestione degli errori, ma questo è solo un esempio.

    
risposta data 28.11.2015 - 22:17
fonte

Leggi altre domande sui tag