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

如何实现根据多级点分隔键从解码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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:23:14