我有一个看起来像这样的数组:
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循环来构建新数组,对其进行排序等等。
希望有一种更有效的方法来获得所需的结果。
谢谢。
答案 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具有空数组,则将其视为零。