Output multidimensional array into groups

I have a multidimensional dataset that represents a list of users connected to our servers. Each array contains connection information. The same user can be connected to any number of ports on different servers.

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
            ),              
)

I need to group the servers first and then the ports and print a list showing connected users for each server and port, as shown below:

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

I am confused how to approach this. Should I use a multidimensional array sort function (e.g. array_multisort) or should I build a new array? In this regard, we will gratefully accept examples.

+3
source share
4 answers

, , :

$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";
}

+2

, . , 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
        ),

, .

+1

, gonig , . , -- , , .

, PHP Object. , , . , . , , , .

.

+1

:

$new_array = array();
foreach($old_array as $user) {
    //create new server entry, not 100% sure if it 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);
0
source

All Articles