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

PHP通过占位符读取嵌套JSON失败,为何直接调用属性却正常?

自定义翻译函数的问题分析与解决

问题原因

你遇到的核心问题是:PHP不会把字符串里的->解析为属性访问操作符。当你把start.body.headline替换成start->body->headline后,$json->$string实际上是在尝试访问$json对象中名为start->body->headline的单个属性,而不是链式访问start→body→headline。显然你的JSON对象里不存在这个奇怪的属性名,所以没有任何输出。

而直接写$json->start->body->headline时,PHP会依次解析每个->,逐个访问嵌套属性,所以能正常获取值。

解决方案

方法1:分割键名,循环访问对象属性

将传入的点分隔字符串拆分为键名数组,然后逐层遍历对象属性:

function trans($string) {
    // 简化语言判断逻辑
    $lang = isset($_GET['langID']) ? $_GET['langID'] : 'de';
    
    $str = file_get_contents('lang/' . $lang . '.json');
    $json = json_decode($str);
    $keys = explode('.', $string);
    
    $current = $json;
    foreach ($keys as $key) {
        // 检查属性是否存在,避免报错
        if (!isset($current->$key)) {
            // 找不到时返回原键名或自定义默认值
            echo $string;
            return;
        }
        $current = $current->$key;
    }
    
    echo $current;
}

方法2:转为关联数组访问

使用json_decode($str, true)将JSON转为关联数组,再通过数组键名逐层访问:

function trans($string) {
    $lang = $_GET['langID'] ?? 'de'; // PHP 7+ 可用null合并运算符
    
    $str = file_get_contents("lang/{$lang}.json");
    $json = json_decode($str, true);
    $keys = explode('.', $string);
    
    $current = $json;
    foreach ($keys as $key) {
        if (!isset($current[$key])) {
            echo $string;
            return;
        }
        $current = $current[$key];
    }
    
    echo $current;
}

这两种方法都能正确解析嵌套的键名路径,实现你想要的翻译功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:05:20