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

如何将嵌套PHP JSON Object/Array转换为PHP关联数组?需完善转换函数

嵌套JSON Object/Array转关联数组的实现方案

没问题,我来帮你搞定这个需求!先看你给出的初始代码,核心问题出在值类型的判断部分,还有全局变量的使用可以优化下,另外递归的初始参数也需要调整。我给你完善后的完整实现,顺便解释下关键细节:

方案1:转成扁平带路径键的关联数组(匹配你初始代码的意图)

这个方案会把嵌套结构里的每个叶子节点,用路径拼接(比如name/first_name)作为键,值就是叶子节点的内容,最终得到一个扁平的关联数组。

完整代码

// 初始化结果数组
$final_array = [];

/**
 * 将嵌套的JSON对象/数组转换为带路径键的关联数组
 * @param string $initial 当前路径前缀
 * @param mixed $json_object 要处理的JSON对象或数组
 * @param array &$result 结果数组(引用传递)
 */
function toArray($initial, $json_object, &$result) {
    foreach ($json_object as $key => $value) {
        // 拼接当前节点的完整路径,避免根节点出现多余的斜杠
        $currentKey = $initial === '' ? (string)$key : $initial . '/' . (string)$key;
        
        // 判断当前值是否是嵌套结构(对象或数组),是则递归处理
        if (is_object($value) || is_array($value)) {
            toArray($currentKey, $value, $result);
        } else {
            // 非嵌套类型直接存入结果数组
            $result[$currentKey] = $value;
        }
    }
}

// 测试用JSON字符串
$json = '{
    "name":{
        "first_name":"James",
        "last_name":"Bond"
    },
    "aliases":["007","Bond"],
    "profiles":[{"0":"unknown"},"007",{"2":"secret agent"}]
}';

// 解码JSON:这里可以选择对象模式(默认)或关联数组模式
$decodedJson = json_decode($json);
// 也可以用关联数组模式解码:$decodedJson = json_decode($json, true); 函数同样兼容

// 初始调用:初始路径为空字符串,避免根键带前置斜杠
toArray('', $decodedJson, $final_array);

// 打印结果
print_r($final_array);

关键优化点

  • 替换全局变量为引用传递:原来的全局$final_array容易引发意外的变量污染,改成引用传递后,函数内部直接操作外部数组,更符合PHP开发的最佳实践。
  • 准确的嵌套结构判断:用is_object($value) || is_array($value)检测嵌套类型——JSON解码后,对象会变成stdClass实例,数组是普通PHP数组,这两种情况都需要递归处理;其他类型(字符串、整数、布尔、null等)直接作为叶子节点存入结果。
  • 路径拼接优化:初始路径为空时,直接使用当前键作为路径,避免出现/name/first_name这种带前置斜杠的键,更符合预期。
  • 兼容两种解码模式:不管你用json_decode($json)(返回对象)还是json_decode($json, true)(返回关联数组),这个函数都能正常工作。

测试输出

运行后你会得到这样的扁平数组:

Array
(
    [name/first_name] => James
    [name/last_name] => Bond
    [aliases/0] => 007
    [aliases/1] => Bond
    [profiles/0/0] => unknown
    [profiles/1] => 007
    [profiles/2/2] => secret agent
)

方案2:转成与原JSON结构一致的嵌套关联数组

如果你的需求是得到和原JSON结构完全匹配的嵌套关联数组,其实不用自己写递归函数,PHP自带的json_decode就能搞定,只需要给第二个参数传true:

$json = '{
    "name":{
        "first_name":"James",
        "last_name":"Bond"
    },
    "aliases":["007","Bond"],
    "profiles":[{"0":"unknown"},"007",{"2":"secret agent"}]
}';

// 直接解码为嵌套关联数组
$nestedArray = json_decode($json, true);
print_r($nestedArray);

这样得到的结果就是和原JSON结构完全一致的嵌套PHP关联数组,非常方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:28:53