如果阵列有超过10个元素......那么什么?

时间:2016-01-07 10:11:07

标签: php arrays

我这里有十大名单。该列表包含访问该域的所有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。

我希望你能理解我想说的话。我来自德国,所以我的英语不是那么好。

非常感谢:)

4 个答案:

答案 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,则不会给出检查,所以请检查一下,我已经更新了我的答案