You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按条件统计多维数组中主机的重复接口次数

问题需求

我有一组包含主机与对应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. 遍历原始数据时,直接以主机为键,接口为子键,累计每个接口的出现次数,一步完成统计。
  2. 遍历统计后的数组,按照要求的格式输出,可根据需求选择是否只输出重复次数大于1的条目。
  3. 使用PHP7+的??空合并运算符简化初始化逻辑,代码更紧凑。

运行输出

Host 192.168.0.1 has eth1 repeated 2 times.

内容的提问来源于stack exchange,提问作者Tatsuya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:25:33