如果数组存在于txt文件中并返回boolean,则使用foreach检查PHP

时间:2017-11-30 03:46:05

标签: php boolean

我知道这是基本代码,但在某个地方是一个我在下班后无法弄清楚的错误。在blocklist.txt里面有几行IP,它们应该检查是否存在或者给出布尔值true或false out。即使它匹配,我也没有得到布尔值。

function blocklist($ip) {
    $blocked = false;
    $ipList = file('blocklist.txt', FILE_SKIP_EMPTY_LINES) // ip in array
        or exit("Unable to open blocklist file");

    foreach ($ipList as $entry) {
        if(strpos($entry, $ip)) { // check if ip exist in array
            $blocked = true; // set true
            break; 
        }
        echo $blocked ? 'true' : 'false';
    }
    return $blocked;
}

function getUserIP() {
    $ip = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ip = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    else
        $ip = 'UNKNOWN';
    return $ip;
}

blocklist.txt内容

123.45.67.89
464.93.47.37
95.83.46.359
237.8.54.849

2 个答案:

答案 0 :(得分:1)

当您从blocklist.txt变量中的$ipList解析IP时,会为每个IP添加额外的空间,因此我使用

$ipList中的每个值中删除了空格

array_map('trim',$ipList)

function blocklist($ip) {
    //remove white space from input array
    $ip = trim($ip);
    $blocked = false;
    $ipList = file('blocklist.txt', FILE_SKIP_EMPTY_LINES) // ip in array
        or exit("Unable to open blocklist file");
    //remove the white space from each value 
    $ipList = array_map('trim',$ipList);
    //Check if IP exist in the array list 
    if(in_array($ip,$ipList)){
        return true;
    }else{
        return false;
    }
}

function getUserIP() {
    $ip = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ip = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    else
        $ip = 'UNKNOWN';
    return $ip;
}

var_dump(blocklist('123.45.67.89')); //output true

答案 1 :(得分:0)

我认为将文件内容分解为数组是不合理的,进行迭代function blocklist($ip){ if(!$ipList=file_get_contents('blocklist.txt')){ exit("Unable to open blocklist file"); } return preg_match('/\b\Q'.$ip.'\E\b/',$ipList) ? true : false; } 调用以从每个元素中删除空白,然后扫描新准备的数组以获得相同的值匹配。

有充分的理由不这样做吗?单个函数调用将更有效/更直接。

$ipList

以下是demo,其中包含静态function blocklist($ip){ $ipList='123.45.67.89 464.93.47.12 464.93.47.123 95.83.46.359 237.8.54.849'; // vv-----------vv-Word Boundaries to ensure no extra digits are matched return preg_match('/\b\Q'.$ip.'\E\b/',$ipList) ? true : false; // ^^-------^^-Interpret $ip string literally, so dots are not "any character" (only important in extreme fringe cases) } var_export(blocklist('464.93.47.123')); // true var_export(blocklist('464.93.1.123')); // false 字符串:

array_map()

否则,如果您已设置处理数组的心脏,请执行一个提前退出的循环(不是in_array(),而是function blocklist($ip){ $ipList = file('blocklist.txt', FILE_SKIP_EMPTY_LINES) // ip in array or exit("Unable to open blocklist file"); foreach ($ipList as $entry) { if($ip===trim($entry)) { // check if ip value is element value return true; // set true and early exit } } return false; }

function getUserIP() {
    if (getenv('HTTP_CLIENT_IP')) return getenv('HTTP_CLIENT_IP');
    if (getenv('HTTP_X_FORWARDED_FOR')) return getenv('HTTP_X_FORWARDED_FOR');
    return 'UNKNOWN';
}

此外,可以改进其他功能以使用更简单/更短的语法:

{{1}}