如何实现根据多级点分隔键从解码JSON中取值的函数?
实现多级键路径获取JSON值的函数
这个需求其实挺普遍的,我给你写个通用的PHP函数,不管你的键字符串有多少个.分隔符,都能精准定位到JSON数据里的对应值,而且还能兼容数组和对象两种解码后的JSON格式。
基础版函数(针对关联数组)
先从最基础的场景开始,假设你用json_decode($json, true)把JSON解码成了关联数组:
function getNestedValue($data, $key) { // 把带点的键拆分成层级数组 $keyParts = explode('.', $key); $currentData = $data; foreach ($keyParts as $part) { // 检查当前层级是否存在这个键,不存在直接返回null if (!isset($currentData[$part])) { return null; } // 深入下一层数据 $currentData = $currentData[$part]; } return $currentData; }
带默认值的增强版
如果想在键不存在的时候返回自定义默认值,而不是null,可以给函数加个默认参数:
function getNestedValue($data, $key, $default = null) { $keyParts = explode('.', $key); $currentData = $data; foreach ($keyParts as $part) { if (!isset($currentData[$part])) { return $default; } $currentData = $currentData[$part]; } return $currentData; }
兼容数组和对象的终极版
要是你的JSON解码后是对象(也就是没传json_decode的第二个true参数),可以修改函数让它同时支持数组和对象:
function getNestedValue($data, $key, $default = null) { $keyParts = explode('.', $key); $currentData = $data; foreach ($keyParts as $part) { // 处理数组类型 if (is_array($currentData) && isset($currentData[$part])) { $currentData = $currentData[$part]; } // 处理对象类型 elseif (is_object($currentData) && property_exists($currentData, $part)) { $currentData = $currentData->$part; } // 都不匹配就返回默认值 else { return $default; } } return $currentData; }
怎么用?举个例子
假设你的$system解码后是这样的:
// 解码成关联数组 $system = json_decode('{ "style": { "background": "#ffffff", "color": "#333333" }, "version": "1.0.0" }', true);
调用函数的效果:
- 获取单层键:
getNestedValue($system, 'version')→ 返回"1.0.0" - 获取三层键:
getNestedValue($system, 'style.background')→ 返回"#ffffff" - 获取不存在的键:
getNestedValue($system, 'style.border', '#000')→ 返回"#000"
这个函数逻辑清晰,也很容易扩展,比如你还可以加异常处理之类的,根据自己的需求调整就行。
内容的提问来源于stack exchange,提问作者Lewis Johnson
相关产品推荐
相关产品推荐

