Heim  >  Fragen und Antworten  >  Hauptteil

Zählen eines Arrays basierend auf einer Bedingung: Schritt-für-Schritt-Anleitung

Ich habe eine Liste von Hosts mit Schnittstellen. Der Code muss die doppelten Schnittstellen für jeden Host zählen. Schließlich muss der Code auch die doppelte Schnittstelle X-mal für jeden Host anzeigen.

Ich stelle diese Frage, weil ich Benachrichtigungen senden möchte, dass der X-Host mit einer oder mehreren ausgefallenen Schnittstellen ausgefallen ist.

$data = array(
    array("192.168.0.1","eth1"),
    array("192.168.0.2","eth2"),
    array("192.168.0.3","eth3"),
    array("192.168.0.1","eth1"),
    array("192.168.0.4","eth1"),
    array("192.168.0.2","eth5")
);

Ich bin hier anderen Beispielen gefolgt, aber die meisten sind einfache Arrays, oder wenn es sich um ein mehrdimensionales Beispiel handelt, sind die Beispiele nicht ähnlich.

Ich habe es schon ausprobiert...

<?php
$data = array(
    array("192.168.0.1","eth1"),
    array("192.168.0.2","eth2"),
    array("192.168.0.3","eth3"),
    array("192.168.0.1","eth1"),
    array("192.168.0.4","eth1"),
    array("192.168.0.2","eth5")
);


$counter_data = count($data);

$duplicated_host = array_filter(array_count_values(array_column($data, 0)), function($v) { return $v > 1; });
print_r($duplicated_host);
print ("<br>");

$duplicated_host_keys = (array_keys($duplicated_host));

for ($row_num = 0; $row_num < $counter_data; $row_num++)
{
    $host = $data[$row_num][0];
    $interface = $data[$row_num][1];
    if (in_array($host,$duplicated_host_keys))
    {
        print($host . " " . $interface . "<br>");
    }
    
}

Der obige Code ist falsch, er funktioniert einigermaßen, aber es ist nicht das, was ich erwartet habe ... Gibt es eine einfache Möglichkeit, dies zu tun?

Die endgültige Ausgabe sollte so aussehen:

Host 192.168.0.1 has eth1 repeated 2 times. --> For current data only
Host 192.168.0.1 has eth9 repeated 5 times.
Host 192.168.0.4 has eth1 repeated 9 times.

P粉133321839P粉133321839375 Tage vor542

Antworte allen(2)Ich werde antworten

  • P粉124070451

    P粉1240704512023-09-11 12:09:10

    这可能就是您正在寻找的:

    <?php
    $input = array(
        array("192.168.0.1","eth1"),
        array("192.168.0.2","eth2"),
        array("192.168.0.3","eth3"),
        array("192.168.0.1","eth1"),
        array("192.168.0.4","eth1"),
        array("192.168.0.2","eth5"),
    );
    $output = [];
    array_walk($input, function($entry) use (&$output) {
        [$host, $interface] = $entry;
        if (isset($host, $output) && isset($interface, $output[$host])) {
            $output[$host][$interface]++;
        } else {
            $output[$host][$interface] = 1;
        }
    });
    print_r($output);

    输出为:

    Array
    (
        [192.168.0.1] => Array
            (
                [eth1] => 2
            )
        [192.168.0.2] => Array
            (
                [eth2] => 1
                [eth5] => 1
            )
        [192.168.0.3] => Array
            (
                [eth3] => 1
            )
        [192.168.0.4] => Array
            (
                [eth1] => 1
            )
    )

    Antwort
    0
  • P粉706038741

    P粉7060387412023-09-11 09:48:22

    您需要对两个分组进行分组,首先是主机,然后是接口。

    然后您可以循环此分组数组以显示/发送输出:

    <?php
    
    $data = array(
        array("192.168.0.1","eth1"),
        array("192.168.0.2","eth2"),
        array("192.168.0.3","eth3"),
        array("192.168.0.1","eth1"),
        array("192.168.0.4","eth1"),
        array("192.168.0.2","eth5")
    );
    
    
    $result = [];
    
    foreach ($data as $arr) {
        [ $host, $nic ] = $arr;
        if (!isset($result[$host])) {
            $result[$host] = [];
        }
        if (!isset($result[$host][$nic])) {
            $result[$host][$nic] = 0;
        }
    
        $result[$host][$nic]++;
    }
    
    
    foreach ($result as $host => $nics) {
        foreach ($nics as $nic => $count) {
            echo "${host} has his '${nic}' interface fail ${count} time(s)" . PHP_EOL;
        }
    }
    192.168.0.1 has his 'eth1' interface fail 2 time(s)
    192.168.0.2 has his 'eth2' interface fail 1 time(s)
    192.168.0.2 has his 'eth5' interface fail 1 time(s)
    192.168.0.3 has his 'eth3' interface fail 1 time(s)
    192.168.0.4 has his 'eth1' interface fail 1 time(s)
    

    在线试用!


    NIC -->“网络接口卡”

    Antwort
    0
  • StornierenAntwort