簡體   English   中英

如何在PHP中不使用'eval'的情況下創建動態IF語句?

[英]How to create dynamic IF statements without using 'eval' in PHP?

我想使用來自數據庫的一些選項在PHP中構建IF語句。

假設我從數據庫中得到了一個這樣的數組:

$db = [
    'number1' => [
        '<= 5',
        '&&'
    ],
    'number2' => [
        '> 200',
        '&&'
    ],
    'number3' => [
        '= 1',
        '||'
    ],
    'number3' => [
        '= 2',
        '||'
    ],
];

我想將其翻譯成:

if ($data['number1'] <= 5 && 
    $data['number2'] > 200 &&
    ($data['number3'] == 1 || 
     $data['number3'] == 2
    )) {
    // do something
}

當然,我會先做一個foreach並將該數組的KEY放入$data['']數組中。 但是,我不確定如何將邏輯運算符和所有其他內容放置到位。

有人可以給我一個主意嗎?

最好對來自MySQL或任何用戶產生的數據的數據進行清理,而不要使用eval() 對於您的情況,我建議將您的數據分為:

  • 操作員
  • 操作數
  • 下一個邏輯

然后將其與現有的進行比較,然后使用它。 首先,您可以執行以下操作:

if ($operator == ">=")
  if ($operand >= $value)

或類似的遞歸構建-這是關鍵。 希望這可以幫助。

好吧,聽起來很奇怪,但是我嘗試了一些小代碼示例: https : //3v4l.org/h21gv

<?php

$arr = [
    'number1' => [
        'value' => 2,
        'comparator' => '<=',
        'compareTo' => 5,
        'next' => '&&'
    ],
    'number2' => [
        'value' => 230,
        'comparator' => '>',
        'compareTo' => 200,
        'next' => '&&'
    ],
    'number3' => [
        'value' => 1,
        'comparator' => '==',
        'compareTo' => 1,
        'next' => '||'
    ],
    'number3' => [
        'value' => 2,
        'comparator' => '==',
        'compareTo' => 2,
        'next' => '||'
    ],
];



function comparator(array $ar) {
    $i = 0;
    $m = count($ar);
    $last = true;
    foreach ($ar as $compare) {
        $i++;
        switch($compare['comparator']) {
            case '<=':
                $bool = $compare['value'] <= $compare['compareTo'];
                break;
            case '>':
                $bool = $compare['value'] > $compare['compareTo'];
                break;
            case '==':
                $bool = $compare['value'] == $compare['compareTo'];
                break;
        }
        if ($i < $m) {
            switch($compare['next']) {
            case '||':
                $last = $last || $bool;
                break;
            case '&&':
                $last = $last && $bool;
                break;
            }
        }
    }
    return $last;
}

var_dump(comparator($arr));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM