Вывести многомерный массив в группы - PullRequest
3 голосов
/ 09 июня 2011

У меня есть многомерный массив данных, который представляет список пользователей, которые подключены к нашим серверам.Каждый массив содержит информацию о соединении.Один и тот же пользователь может быть подключен к любому количеству портов на разных серверах.

Array(  [0] => Array(
            [0] => serverA
            [1] => port1,
            [2] => user1,
            [3] => ip1
        ),
        [1] => Array(
            [0] => serverB
            [1] => port2,
            [2] => user2,
            [3] => ip2
            ),
        [2] => Array(
            [0] => serverC
            [1] => port1,
            [2] => user3,
            [3] => ip3
            ),  
        [3] => Array(
            [0] => serverA
            [1] => port1,
            [2] => user4,
            [3] => ip4
            ),  
        [4] => Array(
            [0] => serverB
            [1] => port4,
            [2] => user5,
            [3] => ip5
            ),  
        [5] => Array(
            [0] => serverC
            [1] => port1,
            [2] => user6,
            [3] => ip6
            ),
        [6] => Array(
            [0] => serverA
            [1] => port2,
            [2] => user7,
            [3] => ip7
            ),              
)

Мне нужно сначала сгруппировать серверы, а затем порты и распечатать список, показывающий подключенных пользователей для каждого сервера и порта.как показано ниже:

ServerA
    port1
        user1,ip1
        user4,ip4
    port2
        user7,ip2
ServerB
    port2
        user2,ip2
    port4
        user5,ip5
ServerC
    port1
        user3,ip3
        user6,ip6

Я не совсем понимаю, как к этому подойти.Должен ли я использовать многомерную функцию сортировки массивов (например, array_multisort) или я должен строить новый массив?Примеры будут с благодарностью.

Ответы [ 4 ]

2 голосов
/ 09 июня 2011

Вы можете создать новый массив, в котором вы суммируете данные и затем печатаете их в требуемом формате:

$newArr = array();

foreach($arr as $k => $v) {
        if(!isset($newArr[$v[0]][$v[1]])) {
                $newArr[$v[0]][$v[1]] = array();
        }
        $newArr[$v[0]][$v[1]][] = array($v[2],$v[3]);
}

foreach($newArr as $k => $v) {
        echo $k,"\n";
        foreach($v as $k1 => $v1) {
                echo "\t$k1\n";
                foreach($v1 as $k2 => $v2) {
                        echo "\t\t", $v2[0],",",$v2[1],"\n";
                }
        }

        echo "\n";
}

Посмотреть

1 голос
/ 09 июня 2011

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

Честно говоря, вам нужно создать PHP Object для этого. То, что я хотел бы сделать, это представить сервер с моим объектом, с массивом для каждого порта. Таким образом, вы можете хранить более одного пользователя на порт. Кроме того, после того, как вы это сделаете, вы можете написать метод для анализа всех массивов и упорядочить его так, как вам нужно.

Только мои два цента.

1 голос
/ 09 июня 2011

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

у вас есть

[serverA] => Array (
        [0] => port1,
        [1] => user1,
        [2] => ip1
        ),
[serverA] => Array (
        [0] => port1,
        [1] => user4,
        [2] => ip4
        ),
[serverA] => Array (
        [0] => port2,
        [1] => user7,
        [2] => ip7
        ),

Пожалуйста, проверьте массив и перефразируйте вопрос.

0 голосов
/ 09 июня 2011

Я бы построил новый массив:

$new_array = array();
foreach($old_array as $user) {
    //create new server entry, not 100% sure if it's really needed
    if(!isset($new_array[$user[0]])) $new_array[$user[0]] = array();

    //build the new array
    $new_array[$user[0]][$user[1]] = array($user[2], $user[3]);
}

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