我这里有十大名单。该列表包含访问该域的所有IP(来自我的日志文件),下面的代码为我提供了前10个IP。
但我想要它更动态。就像有超过10种不同的IP一样,只给出10个看起来最多的IP。如果不同IP的数量小于10,请给我所有的IP。
此代码:
$all_ips = array_count_values($ip_array);
arsort($all_ips);
$count = count($all_ips);
$keys = array_keys($all_ips);
$topTenIp = array();
$count = $count -1;
for($i=0; $i <= $count; $i++){
if($count < 9){
$topTenIp[] = $keys[$i];
}else{
$topTenIp[] = $keys[$i];
}
}
这可行但不完美。如果IP的数量低于10,它会给我所有的IP。但如果有超过10个,它并没有给我10个最新出现的IP,它只是给了我日志脚本的所有IP。
我希望你能理解我想说的话。我来自德国,所以我的英语不是那么好。
非常感谢:)
答案 0 :(得分:4)
我根本不知道这与Laravel有什么关系,但无论如何:
$counted = array_count_values($ipArray);
arsort($counted);
$top = array_keys(array_slice($counted, 0, 10));
如果您的源$ ipArray是一个简单的IP地址数组,那么获得前10个项目会更快,更简单。
答案 1 :(得分:2)
你所做的不合逻辑。假设$all_ips
为30,则每30次迭代将在else中执行。导致30个ip的阵列。
您需要更改if和else部分。
for($i=0; $i <= $count; $i++){
if($i < 9){
$topTenIp[] = $keys[$i];
} else {
break; //Break out of the loop
}
}
答案 2 :(得分:0)
这是因为你在if和else条件下执行相同的代码。
你可以这样做:
for($i=0; $i <= $count; $i++){
if($i < 9){
$topTenIp[] = $keys[$i];
}
}
答案 3 :(得分:-1)
请尝试以下
$all_ips = array_count_values($ip_array);
arsort($all_ips);
$count = count($all_ips);
$keys = array_keys($all_ips);
$topTenIp = array();
$count = $count -1;
for($i=0; $i <= $count; $i++){
if($count < 9){
$topTenIp[] = $keys[$i];
}else{
$topTenIp[] = $keys[$i];
}
if( $i >= 9 )
{
break;
}
}
在您的代码中,如果数字数量大于10,则不会给出检查,所以请检查一下,我已经更新了我的答案