如何按条件统计多维数组中主机的重复接口次数
问题需求
我有一组包含主机与对应interface的多维数组,需要编写PHP代码统计每个主机下重复出现的interface次数,最终输出类似 Host 192.168.0.1 has eth1 repeated 2 times. 的格式用于告警。我尝试了一段代码但未达到预期,相关信息如下:
示例数据
$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") );
尝试的代码
<?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>"); } }
期望输出
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.
请问是否有更简洁的实现方式?
解决方案
可以通过一次遍历完成统计,直接按「主机-接口」的层级构建计数数组,逻辑更清晰简洁:
<?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") ); // 初始化计数数组 $counts = []; // 遍历数据统计次数 foreach ($data as $item) { $host = $item[0]; $interface = $item[1]; // 若主机不存在则初始化数组,接口计数加1 $counts[$host][$interface] = ($counts[$host][$interface] ?? 0) + 1; } // 遍历计数数组输出告警格式 foreach ($counts as $host => $interfaces) { foreach ($interfaces as $interface => $times) { // 只输出重复次数大于1的条目(如果需要所有条目可去掉此判断) if ($times > 1) { echo "Host {$host} has {$interface} repeated {$times} times.\n"; } } }
代码说明
- 遍历原始数据时,直接以主机为键,接口为子键,累计每个接口的出现次数,一步完成统计。
- 遍历统计后的数组,按照要求的格式输出,可根据需求选择是否只输出重复次数大于1的条目。
- 使用PHP7+的
??空合并运算符简化初始化逻辑,代码更紧凑。
运行输出
Host 192.168.0.1 has eth1 repeated 2 times.
内容的提问来源于stack exchange,提问作者Tatsuya
相关产品推荐
相关产品推荐

