Php में एक स्ट्रिंग सूत्र के साथ डेटा सेट का मूल्यांकन


9

मुझे एक आवेदन में कुछ शर्तों को अद्यतन करने का काम सौंपा गया था। मेरे पास मूल्यांकन करने के लिए एक डेटा सेट है, और इसे निम्नलिखित तरीके से हार्ड-कोड किया गया है:

$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;

और इसी तरह...

कई जगहों पर बनाए रखना दुःस्वप्न है।

जो मैं अनिवार्य रूप से देख रहा हूं वह डेटा का मूल्यांकन करने के लिए क्वेरी स्ट्रिंग में पारित करने के लिए कुछ रास्ता बनाना है। शुरुआत के लिए एक सरल सूत्र को एक सरणी के रूप में परिभाषित किया जा सकता है

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

यह फिर बढ़ाया जा सकता है और पुनरावर्ती कहा जा सकता है

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

लेकिन मैं मूल रूप से सूत्र ए स्ट्रिंग को स्टोर करने के लिए देख रहा हूं, जैसे:

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

जहां [] सरणी कुंजियों की पहचान करेगा

या शायद एक्सेल में ऐसा कुछ

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

क्या ऐसा करने का कोई साफ समाधान है? मेरे पास एक विचार है कि इसके लिए पूरे पुस्तकालय का निर्माण कैसे किया जाए, शायद भविष्य में।

मैं हर बार कोड में नई शर्तें नहीं जोड़ना चाहता। वे पहले से ही आवेदन भर में हैं। इसे कॉन्फ़िगरेशन में संग्रहीत करना और एक स्थान पर विस्तार या संशोधित करना बेहतर होगा।

किसी भी मदद की बहुत सराहना की।


1
मूल्यांकनकर्ता लिखना एक जटिल काम है, लेकिन आप इस सवाल का जवाब देने के लिए ircmaxell के उत्तर पर एक नज़र डाल सकते हैं और / या तार भी संभाल सकते हैं; या PHPExcel की
मार्क बेकर

1
मुझे लगता है कि एक "स्वच्छ" समाधान विभिन्न कार्यों के साथ एक वर्ग स्थापित करने और इसे कई फाइलों में शामिल करने के लिए होगा। कोड को एक स्ट्रिंग के रूप में संग्रहीत करने और इसे बाद में मूल्यांकन करने के लिए, PHP प्रदान करता है eval()

1
धन्यवाद @MarkBaker, मैं उन पर एक नज़र हो सकता है। नहीं बिल्कुल मैं तुम्हें देख रहा हूँ। मैं वास्तव में eval () का उपयोग नहीं करना चाहता, यह बहुत खतरनाक हो सकता है, क्योंकि उन सूत्रों का उपयोग उपयोगकर्ताओं द्वारा किया जाएगा। यह अधिक मूर्ख होना चाहिए।
पावेल जानकोव्स्की

3
"इनर-प्लेटफ़ॉर्म प्रभाव" बनाने के लिए देखें। यह कल्पना करना कठिन है कि आपने हमें अब तक क्या दिखाया है कि आप कोड की कई पंक्तियों को सहेज लेंगे। आप PHP के सभी वाक्यविन्यास को पसंद नहीं कर सकते हैं, लेकिन यह एक मानक है जिसे कोई भी PHP डेवलपर (या C ++ या जावा डेवलपर) समझ सकता है। इसलिए जब यह कोशिश करने के लिए एक मज़ेदार चीज़ लगती है, तो इसे पहले छोटे स्तर की परियोजना पर प्रयोग करना बेहतर होगा। अगर यह वहां काम करता है, तो इसे बड़ी परियोजना में रोल करने पर विचार करें।
जॉन डोए

1
RPN मूल्यांकनकर्ता लिखना और रखरखाव करना एक सरल कार्य होगा। यह बहुत शक्तिशाली है और कम चीजें हैं जो आप गलत कर सकते हैं। यह एक भाषा के रूप में उपयोगकर्ता के अनुकूल कम है।
Scara95

जवाबों:


1

तो यह केवल त्वरित समाधान है, लेकिन अभी मेरे लिए काम करता है।

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

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

यदि सूत्र में [ए] है तो इसे एरे की कुंजी माना जाएगा।

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

इस समाधान में यह सूत्र के साथ काम करेगा जैसे:

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

यह बिल्कुल वैसा नहीं है जैसा मैं चाहता था, बल्कि काम करता है, और इतना भयानक नहीं है (मुझे आशा है)। इसे कुछ इनपुट जाँच और त्रुटि से निपटने की आवश्यकता है, लेकिन यह केवल एक उदाहरण है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.