PHP如何获取数组指定键路径字符串并支持通配符匹配取值
问题解答
针对你提出的多厂商路由器数组结构索引不一致的三个问题,答案如下:
PHP原生实现能力
PHP原生完全可以实现你需要的getpath($array, $targetKey)功能,不需要安装任何扩展。核心逻辑是递归遍历数组,逐层记录遍历路径,匹配到目标键名时返回拼接好的点分隔格式路径即可,参考实现代码:
function getpath(array $array, string $targetKey, string $currentPath = ''): ?string { foreach ($array as $key => $value) { $newPath = $currentPath ? "{$currentPath}.{$key}" : $key; // 命中目标键直接返回当前路径 if ($key === $targetKey) { return $newPath; } // 子元素是数组则继续递归查找 if (is_array($value)) { $found = getpath($value, $targetKey, $newPath); if ($found !== null) { return $found; } } } // 没找到目标键返回null return null; }
传入你的示例数组和目标键名SoftwareVersion,无论中间数字索引是0/1还是1/2,都能返回正确的点分隔路径;如果需要获取到_value的完整路径,把目标键传为_value即可。
Laravel相关支持
不需要安装第三方扩展包,Laravel自带的数组工具类已经覆盖你需要的绝大多数场景:
- Laravel的
Arr::get()方法原生支持点分隔路径读取数组值,拿到路径后可直接调用取值。 - 你提到的忽略数字索引的通配符取值需求,
Arr::get()已经原生支持,不需要提前查找路径,直接写通配符规则就能取值:
// 自动匹配DeviceInfo、SoftwareVersion下的任意数字索引,直接拿到软件版本值 $version = Arr::get($InternetGatewayDevice, 'DeviceInfo.*.SoftwareVersion.*._value');
非Laravel项目也可以单独引入Illuminate/Support组件使用这个能力,不需要安装完整框架。
原生数组通配符语法说明
PHP原生数组访问语法不支持$array['key'][*]['subkey']这类通配符写法,原生语法要求访问数组时必须传入明确存在的键名/索引。如果不想依赖第三方组件,也可以自己写几十行代码实现通配符匹配逻辑,实现成本很低。
针对TR069协议返回的网关设备数据场景,直接用通配符取值比每次先查找路径再取值的代码更简洁,适配多厂商差异的效率更高。
内容的提问来源于stack exchange,提问作者muhammad ahmed
相关产品推荐
相关产品推荐

