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
相关产品推荐
相关产品推荐

