পিএইচপি মধ্যে একটি স্ট্রিং সূত্র সহ ডেটা সেট মূল্যায়ন


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
মূল্যায়নকারীকে লেখা একটি জটিল কাজ, তবে আপনি হ্যান্ডেল এবং / অথবা এবং স্ট্রিংগুলিও পরিচালনা করতে এই প্রশ্নটির আর্কম্যাক্সেলের উত্তর বাড়ানোর দিকে একবার নজর দিতে পারেন ; বা পিএইচপিইএক্সসেলের
মার্ক বাকের

1
আমার ধারণা, "ক্লিন" সমাধানটি হ'ল বিভিন্ন ফাংশন সহ একটি ক্লাস স্থাপন এবং এটি বেশ কয়েকটি ফাইলে অন্তর্ভুক্ত করা। স্ট্রিং হিসাবে কোড সঞ্চয় করতে এবং এটি পরে মূল্যায়ন করতে পিএইচপি প্রস্তাব দেয় eval()

1
আপনাকে ধন্যবাদ! মারকবেকার, আমি সেগুলি দেখতে পারি। আমি আপনাকে যা খুঁজছি ঠিক তা নয়। আমি প্রকৃতপক্ষে ইভাল () ব্যবহার করতে চাই না, এটি খুব বিপজ্জনক হতে পারে, কারণ এই সূত্রগুলি ব্যবহারকারীরা ব্যবহার করবেন। এটি আরও বোকা হতে হবে।
পাভেল জাঙ্কোভস্কি

3
একটি "অভ্যন্তরীণ-প্ল্যাটফর্ম প্রভাব" তৈরি করার জন্য নজর দিন। আপনি এখন পর্যন্ত আমাদের যা দেখিয়েছেন তা থেকে কল্পনা করা শক্ত যে আপনি অনেকগুলি কোডের লাইন সঞ্চয় করে শেষ করেছেন। আপনি পিএইচপি এর সমস্ত সিনট্যাক্স পছন্দ করতে পারেন না, তবে এটি এমন একটি মান যা কোনও পিএইচপি বিকাশকারী (বা সি ++ বা জাভা বিকাশকারী) বুঝতে পারে। এটি চেষ্টা করার মতো একটি মজাদার জিনিস মনে হলেও, এটি একটি ছোট-স্কেল পার্শ্ব প্রকল্পের জন্য প্রথমে এটি ব্যবহার করা ভাল। যদি এটি সেখানে কাজ করে তবে বড় প্রকল্পে রোলিংয়ের বিষয়টি বিবেচনা করুন।
জন ডো

1
একটি আরপিএন মূল্যায়নকারী লিখতে এবং বজায় রাখা সহজ কাজ হবে task এটি বেশ শক্তিশালী এবং আপনার ভুল হতে পারে এমন কম জিনিস রয়েছে। এটি ভাষা চিন্তার হিসাবে কম ব্যবহারকারী বান্ধব।
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']];

এটি আমি যা চেয়েছিলাম ঠিক তা নয়, তবে কাজটি করে, এবং এতটা ভয়ঙ্কর নয় (আমি আশা করি)। এটিতে কিছু ইনপুট চেকিং এবং ত্রুটি পরিচালনা করা দরকার তবে এটি একটি উদাহরণ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.