【问题标题】:Sort array by 2nd level array count按 2 级数组计数对数组进行排序
【发布时间】:2019-11-09 16:37:45
【问题描述】:

我有一个如下所示的数组:

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 循环来构建一个新数组,对其进行排序等等开。

有没有更有效的方法来达到我需要的结果?

【问题讨论】:

  • @EliasSoares 除了这个问题上有完整的 Javascrip 标记
  • 您说的是“计数”,但您的意思似乎是“总和”。
  • @Barmar 确实如此。
  • @RiggsFolly 你是对的。我选择了错误的问题来建议重复。但我很确定 SO 上有很多这样的问题

标签: php arrays sorting multidimensional-array


【解决方案1】:

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

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

【讨论】:

  • 之后还需要拨打asort()
【解决方案2】:

几行就够简单了:

$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 有一个空数组,则将其视为零。

【讨论】:

  • 这似乎工作得很好!我还不能测试到 5 的限制,但我没有理由认为它不会起作用。感谢您提供紧凑的解决方案。
猜你喜欢
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多