Сортировать массив по количеству массивов 2-го уровня - PullRequest
2 голосов
/ 27 июня 2019

У меня есть массив, который выглядит так:

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

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

)

Мне нужно иметь возможность подсчитать содержимое 2-го уровня и затем отсортировать массивы верхнего уровня на основе этих итогов.

Так, например, мой результирующий массив будет выглядеть примерно так:

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. На основании кода, который у меня есть до сих пор, я могу только предусмотреть создание дополнительных циклов для создания нового массива, его сортировки и так далее.

Надеюсь, есть гораздо более эффективный способ достижения нужных мне результатов.

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 27 июня 2019

Просто сопоставьте функцию для суммирования внутренних массивов, отсортируйте и нарежьте первые 5:

$result = array_map('array_sum', $iplog);
arsort($result);
$top5 = array_slice($result, 0, 5, true);
3 голосов
/ 27 июня 2019

Достаточно просто в несколько строк:

$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 есть пустой массив, он рассматривается как ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...