我在文本文件中有一个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
}