本文介绍如何使用
php
遍历含嵌套结构的数值索引数组,提取所有 `remote_address.ip` 值,并统计**除指定“基准 ip”(如首个 ip 或外部传入的母 ip)以外的唯一 ip 及其出现频次**。
在处理网络请求日志、
爬虫
结果或 API 响应等场景时,我们常遇到类似结构的多维数组:每个元素代表一次请求,包含 url、remote_address(含 ip 和 port)及 headers 等字段。若需分析真实客户端分布或识别异常调用源,常需
排除已知可信/基准 IP(如本机出口 IP 或首次出现的 IP),再统计其余 IP 的去重频次
。
核心思路是:
安全提取
每项中的 remote_address.ip(需校验键是否存在,避免 Notice);
跳过基准 IP
(可设为 $motherIp 变量,例如取 $data[0]['remote_address']['ip'] 或由外部传入);
使用关联数组以 IP 为键、计数为值,实现高效去重与累加。
以下是完整、健壮的 PHP 7.4+ 实现:
✅
关键注意事项
:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
永远不要假设嵌套键一定存在
:务必使用 ?? 空合并操作符或 isset() 检查,防止未定义索引警告;
区分“首次出现”与“基准 IP”
:题干中“not the first IP”指逻辑上的参考 IP(如可信网关),而非数组中第 0 项的 IP —— 若需严格排除
首次出现的任意 IP
,可先遍历一次获取首个非空 IP 再二次统计;
如需返回唯一 IP 列表(不计数)
,可改用 array_unique(array_column($filteredItems, 'ip')),但当前需求明确要求“count unique values”,故推荐哈希累加法;
性能提示
:该方案时间复杂度为 O(n),空间复杂度 O(k)(k 为不同 IP 数量),适用于万级以下数据;超
大数据
建议结合数据库或 Redis 统计。
通过此方法,您不仅能准确统计目标 IP 分布,还能轻松扩展至其他字段(如按 content-encoding 分组计数),为数据分析提供坚实基础。
出现次数
print_r($ipCounts);
// 示例输出:
// Array
// (
// [2.2.2.2] => 2
// [3.3.3.3] => 1
// [4.4.4.4] => 1
// )
?>