2016-01-07 51 views
0

我在这里有一个前10名单。该列表包含所有访问该域的IP(在我的日志文件中),下面的代码给出了它们前10个IP。如果数组有超过10个元素......那么是什么?

但我希望它更动态。就像是有超过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

您有IP访问网站的次数吗? – Gauthier

+0

为什么两个代码在if和else中相同? $ topTenIp [] = $ keys [$ i]? –

+0

你for for应该只运行9次'for($ i = 0; $ i <9; $ i ++)' –

回答

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 
     } 
    } 
+0

我会试试:) – PHPprogrammer42

+0

该死的工作就像完美:我会用它,非常感谢! – PHPprogrammer42

+0

呃..也许你可以帮助我与另一件事..这工作只是完美的 - 我试图与一个领域,有更多的10个不同的IP和域少于10 ..它的工作原理 - 但我真的不知道,为什么在最后一个IP之前总是有一条空行(如果域的IP少于10个)---只有一个空的空间,在下一行中最后一个IP oo – PHPprogrammer42

-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,所以请给的支票,我已经更新了我的答案

+1

你需要*解释你的答案。不鼓励使用仅有代码的答案。 –

+0

另外你已经有了一个跟踪一个计数($ i)的变量,所以为什么不用它来创建另一个变量。 – Titi

+0

我已经做了更正,并感谢您的宝贵意见 –

0

这是因为你在if和else条件下做了相同的代码。

你可以这样做:

for($i=0; $i <= $count; $i++){ 
    if($i < 9){ 
     $topTenIp[] = $keys[$i]; 
    }   
} 
+0

在这个答案中,如果您的$ keys数组中有超过10个项目,那么您的$ topTenIp数组将只是空的。 – Titi

4

我实在不明白这是如何在所有涉及到Laravel,但无论如何:

$counted = array_count_values($ipArray); 
arsort($counted); 
$top = array_keys(array_slice($counted, 0, 10)); 

将是一个更快,更简单的方法获得前10个项目,因为你的源$ ipArray是一个简单的IP地址数组。

+0

它确实没有关系到laravel ..但我还没有找到解决方案laravel为:D但我使用laravel作为我的框架:) 感谢您的帮助:) – PHPprogrammer42

相关问题