亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

創建沒有 eval 的動態 if 語句

創建沒有 eval 的動態 if 語句

PHP
慕的地8271018 2021-11-05 15:07:09
有一個系統可以抓取其他站點,用戶可以獲得有關抓取內容的信息。用戶應該能夠根據抓取的內容創建過濾器(假設它是整數):如果內容小于/大于/等于特定用戶所需的數字等,則跳過結果。因此 PHP 應該能夠檢查這些內容,換句話說:創建一個語句,檢查抓取的結果是否有效,也選擇了過濾器。例子:在這里我們可以看到一個帶有隨機數的 excel 表格(就像一個爬取的網站):用戶通過某些過濾器創建和過濾器排除數字(相同的示例 excel 過濾器): 系統獲取過濾器并過濾結果:現在我需要用 PHP 做同樣的事情。我在考慮 eval 但它在我的 PHP 上被禁用。PHP示例:// the content which was scraped$scrapedResults = [1, 10, 11, 1216, 15, 55, 556, 123, 225, -15,];// the user created filters$filters = [    ['filter' => ['more' => 0], 'operator' => null,],    ['filter' => ['less' => 15], 'operator' => 'and'],    ['filter' => ['equal' => 1216], 'operator' => 'or'],];// the filter checkerfunction isValid(string $action, int $ruleArgument, int $target): bool{    switch ($action)    {        case 'more': return $ruleArgument > $target;        case 'less': return $ruleArgument < $target;        case 'equal': return $ruleArgument === $target;        default: throw new InvalidArgumentException('unknown action given');    }}$result = [];foreach ($scrapedResults as $scrapedResult) {    foreach ($filters as $filter) {        // how to check with all of these filter clauses?    }    // by static this function shoud look like this:    // if($target > 0 && $target < 15 || $tager === 1216) { return true; } else { return false; }    // but how I should it created dynamically??}另一個 PHP 示例:// the filter which user created:$filters = [    ['filter' => ['more' => 1], 'operator' => null,],    ['filter' => ['less' => 15], 'operator' => 'and'],    ['filter' => ['equal' => 1216], 'operator' => 'or'],    ['filter' => ['equal' => 225], 'operator' => 'or'],];// the if clause which my code should generate:// if($target > 1 && $target < 15 || $target === 1216 || $target === 225) {return true;} else {return false;}這項任務有一個轉折。在 excel 過濾器中僅限于 4 個附加過濾器。系統沒有任何限制,所以我可以從 1 到 100000。簡而言之:我需要找到一種方法來在沒有 EVAL() 的情況下在 PHP 中創建 if 動態語句也歡迎任何有關此任務邏輯改進的建議!
查看完整描述

1 回答

?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

我已經使用閉包實現了這一點,有一組數組定義了用于過濾器類型和運算符的回調函數。


每次應用過濾器時,它首先檢查過濾器是否正常,然后array_filter()與查找表中的相應回調一起使用,根據被過濾的值檢查每個項目。一旦過濾了整個數字列表,它就會計算出如何將這些結果與之前的結果結合起來。再次回調知道這部分的邏輯......


// the content which was scraped

$scrapedResults = [1, 10, 11, 1216, 15, 55, 556, 123, 225, -15,];


// the user created filters

$filters = [

    ['filter' => ['more' => 0], 'operator' => null,],

    ['filter' => ['less' => 15], 'operator' => 'and'],

    ['filter' => ['equal' => 1216], 'operator' => 'or'],

];


// Implementation of the filters

$filterType = ['more' => function ($a, $b) { return $a > $b; },

    'less' => function ($a, $b) { return $a < $b; },

    'equal' => function ($a, $b) { return $a == $b; }];


// Implementation of the operators

$operators = ['and' => function ($old, $result ) {

                            return array_intersect($old, $result);

                        },

                'or' => function ($old, $result ) {

                            return array_merge($old, $result);

                        }];


$output = [];

foreach ( $filters as $filter ) {

    $currentType = array_keys($filter['filter'])[0];

    if ( !isset($filterType[$currentType]) ) {

        throw new InvalidArgumentException('unknown action given');

    }

    $filterValue = $filter['filter'][$currentType];

    $callback = $filterType[$currentType];

    $filterRes = array_filter($scrapedResults, function ($a) 

                            use ($callback, $filterValue) {

                    return $callback($a, $filterValue);

                });

    

    if ( $filter['operator'] == null )  {

        $output = $filterRes;

    }

    else if ( isset($operators[$filter['operator']]) )   {

        $output = $operators[$filter['operator']]($output, $filterRes);

    }

}

echo "output->";

print_r($output);

這輸出...


output->Array

(

    [0] => 1

    [1] => 10

    [2] => 11

    [3] => 1216

)


查看完整回答
反對 回復 2021-11-05
  • 1 回答
  • 0 關注
  • 146 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號