按2级数组计数对数组进行排序

时间:2019-06-27 15:50:10

标签: php arrays sorting multidimensional-array

我有一个看起来像这样的数组:

Array(
[172.17.0.2] => Array
    (
        [okok] => 1
    )

[172.17.0.1] => Array
    (
        [wp] => 3
        [ojopj] => 1
        [opjopj] => 1
    )

)

我需要能够计算第二级内容,然后根据这些总数对顶级数组进行排序。

例如,我的结果数组如下所示:

Array(
  [172.17.0.2] => 1
  [172.17.0.1] => 5
)

然后,理想情况下,我想按降序排序并仅显示前5个结果。

目前,我的代码包含以下内容:

foreach ($iplog as $ip => $arr) {
    foreach ($arr as $user => $count) {
        $count_desc = $count_desc + $count;
    }
    $output .= $count_desc;
    $output .= '</span><hr style="width:100%">';
}

但是,这并不需要进行任何排序或将结果限制在前5位。根据我到目前为止的代码,我只能设想创建更多的for循环来构建新数组,对其进行排序等等。

希望有一种更有效的方法来获得所需的结果。

谢谢。

2 个答案:

答案 0 :(得分:4)

只需映射到一个函数即可对内部数组求和,对前5个数组进行排序和切片:

$result = array_map('array_sum', $iplog);
arsort($result);
$top5 = array_slice($result, 0, 5, true);

答案 1 :(得分:3)

几行就足够简单了:

$x = array_map('array_sum', $iplog); // sum the values
arsort($x, SORT_NUMERIC); // reverse sort
$y = array_slice($x, 0, 5, true); // top 5

重要的是,每个转换都保留了密钥。在PHP中,有数组函数可以保留键,而函数不能保留键。意识到这一点可以节省一些悲伤。

旁注,如果IP具有空数组,则将其视为零。