Maison > Questions et réponses > le corps du texte
J'ai une liste d'hôtes avec des interfaces. Le code doit compter les interfaces en double pour chaque hôte. Enfin, le code doit également afficher X fois l’interface dupliquée pour chaque hôte.
Je pose cette question parce que je souhaite envoyer des alertes indiquant que l'hôte X a échoué avec une ou plusieurs interfaces défaillantes.
$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") );
J'ai suivi d'autres exemples ici, mais la plupart sont de simples tableaux, ou s'il s'agit d'un exemple multidimensionnel, les exemples ne sont pas similaires.
Je l'ai déjà essayé...
<?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>"); } }
Le code ci-dessus est faux, il fonctionne un peu mais ce n'est pas ce à quoi je m'attendais... Y a-t-il un moyen facile de faire ceci?
Le résultat final devrait ressembler à ceci :
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粉1240704512023-09-11 12:09:10
C'est peut-être ce que vous recherchez :
<?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);
Le résultat est :
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 ) )
P粉7060387412023-09-11 09:48:22
Vous devez regrouper deux groupes, d'abord l'hôte puis l'interface.
Vous pouvez ensuite parcourir ce tableau groupé pour afficher/envoyer la sortie :
<?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 --> "Carte d'interface réseau"