PHP中键存储在变量时,如何从JSON对象取值?
动态获取嵌套数组的值
遇到这种动态路径的问题,直接拼接字符串肯定行不通,我们可以把路径字符串解析成可遍历的键数组,然后一步步深入嵌套数组取值。这里有个安全且可靠的方案:
步骤1:解析路径字符串
首先需要把$key里的路径提取出来,比如把'["toppings"][2]["type"]'转换成['toppings', 2, 'type']。可以用正则表达式来匹配每个键:
$key = '["toppings"][2]["type"]'; // 匹配所有在[]里的内容,忽略引号 preg_match_all('/["\']?([^"\'\]]+)["\']?/', $key, $matches); $pathSegments = $matches[1]; // 得到 ['toppings', '2', 'type']
步骤2:遍历路径取值
写一个通用函数,接收嵌套数组和路径数组,逐层访问:
function getNestedValue(array $data, array $path) { $current = $data; foreach ($path as $segment) { // 如果是数字类型的键,转换成整数(因为数组索引是int) if (is_numeric($segment)) { $segment = (int)$segment; } // 检查当前层级是否存在该键,避免报错 if (!isset($current[$segment])) { return null; // 或者抛出异常,根据你的业务需求处理 } $current = $current[$segment]; } return $current; }
步骤3:调用函数获取值
把解析后的路径和$yummy传入函数即可:
$yummy = json_decode($json, true); $value = getNestedValue($yummy, $pathSegments); echo $value; // 输出 Maple
为什么不推荐用eval?
可能有人会想到用eval("\$value = \$yummy{$key};");来直接执行,但强烈不建议这么做:如果$key是用户输入或者不可信来源的内容,会存在严重的代码注入风险,导致安全问题。上面的正则+遍历方法更安全,也更容易调试和维护。
内容的提问来源于stack exchange,提问作者DMP
相关产品推荐
相关产品推荐

