数组查找中的 PHP 未定义索引


PHP undefined index on array lookup

我在文本文件中有一个IP列表。 我想获取用户的 IP,然后在数组中计数以查看他们是否发出了 2 个以上的请求。

但是我得到了

Undefined index: xx.xxx.xxx.xx

哪里

xx.xxx.xxx.xx is my IP. 

(出于显而易见的原因隐藏(

当我在 txt 文件中有超过 2 个相同的 IP 时,它会返回"查找次数过多",但如果在数组中找不到$value,它将返回未定义的索引。 我以为我抓住了!isset,但如果我删除!它只是运行请求。 如果我将其保留为 !isset,它会运行,但随后返回未定义的索引。

我什至尝试过

if(array_key_exists($value, $array_list)){

但什么都没有。 知道为什么吗?

$list = file_get_contents('ips.txt');
// convert to array
$array_list = (explode(" ",$list));
// Get user's ip
$value = $_SERVER['REMOTE_ADDR'];
if(!isset($array_list[$value])){
    $values = array_count_values($array_list); 
    $count = $values[$value];
    if ($count > 2) {
        return 'Too many lookup attempts, please try again in 24    hours click <a href="/">HERE</a> to return home';
        }
    }
    else {
        // run the ok request
    }

似乎混淆了数组和数组

Explode 返回一个数组,其中字符串中的所有项都是,键只是从 0 开始的数字。举个例子:

$string = "foo bar baz";
$array = explode(' ', $string);
/*
 * Array now holds
 * [0] => "foo",
 * [1] => "bar",
 * [2] => "baz",
 */

在示例中,0,1,2 是,foo、bar、baz 是

所以当你执行

// convert to array
$array_list = (explode(" ",$list));

您的密钥是数字 0-n(n 表示列表中有多少 IP(。每个键都有一个对应的值,这些值是实际的IP。

所以现在当你运行时

if(!isset($array_list[$value])){

你告诉 PHP 要做的是在数组中找到一个与你的 IP 匹配的的条目。除了数组中没有密钥是 IP 地址。

如果要了解数组中是否存在某个值,请使用 array_search((。 或者,在您的情况下,由于您正在通过array_count_values()运行列表,这会将您的转换为,因此您可以在运行函数后对$values变量进行正常的isset()查找。

$values = array_count_values($array_list); // Each IP is now a key of $values
if (isset($values[$value])) {
    // The IP shows up at least once
    $count = $values[$value];
    // continue with other logic here
}
else {
    // The IP is not in the list
    // continue with other logic here
}