PHP数组查找时出现未定义的索引问题

3
我有一个IP列表存在文本文件中。我想获取用户的IP,然后计算数组中是否已经进行了超过2次请求。
但是我现在遇到如下问题:
Undefined index: xx.xxx.xxx.xx

在哪里

xx.xxx.xxx.xx is my IP. 

(因为显而易见的原因而隐藏)

当我在文本文件中有超过2个相同的IP时,它会返回“Too many lookups”,但如果在数组中找不到$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
    }
1个回答

4

看起来你混淆了数组的和数组的

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
}

非常感谢您详细的回复。这比我原来想要做的更有意义。 - ServerSideSkittles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接