跳到主要内容

JSON 转 PHP 数组实战, 对象转关联数组与 Laravel 配置写法

把 JSON 对象转成 PHP 关联数组用 => 语法, 嵌套结构原样保留, 直接粘进 Laravel 配置或 WordPress 迁移代码, 还能讲清和 json_decode 的真正区别。

发布于 作者 李雷
#JSON #PHP #Laravel #数据转换

JSON 转 PHP 数组实战, 对象转关联数组与 Laravel 配置写法

我维护过一个 Laravel 项目, 第三方支付包只给了一份 JSON 默认配置, 而框架想要的是一个返回数组的 config/payment.php。当时我对着 40 多个键手敲了二十分钟, 上线后报错, 翻半天才发现把 timeout 敲成了 tiemout。从那以后我就认准一件事: JSON 转 PHP 数组这种纯机械的活, 不该用手, 该用工具直接出代码字面量, 然后粘进文件。

下面说清楚这件事里几个真正容易踩的点。

JSON 对象怎么变成 PHP 关联数组

核心规则只有一条, 跟着 JSON 的形状走。JSON 对象 {...} 变成 PHP 关联数组, 每个键用 'key' => value 表示; JSON 数组 [...] 变成不带键的索引数组。这个 => 箭头就是 PHP 关联数组的灵魂, 它把字符串键和值绑在一起。

有个细节很多人忽略: 键应该一律带单引号。JSON 的键永远是字符串, 所以像 "0" 这样看着是数字的键, 输出成 '0' 才对。如果偷懒写成不带引号的 0 =>, PHP 会把它强转成整数键 0, 之后你用 '0' 这个字符串键去查就可能查不到。WordPress 的 update_option 存这种键时尤其敏感, 一旦被重新索引, 数据就和你预期的对不上了。

一段真实的输入输出

把这段 JSON 粘进去:

{
  "app": {
    "name": "Toolora",
    "debug": false,
    "providers": ["cache", "queue"],
    "limits": { "0": 100, "rate": 5 }
  }
}

开启 <?php return …; 包裹、短语法 []、缩进 4 空格, 得到:

<?php

return [
    'app' => [
        'name' => 'Toolora',
        'debug' => false,
        'providers' => [
            'cache',
            'queue',
        ],
        'limits' => [
            '0' => 100,
            'rate' => 5,
        ],
    ],
];

注意嵌套结构原样保留, 三层对象就是三层 [], 内层的 providers 是索引数组 (没有键), limits 是关联数组。数字键 '0' 带着引号没被吃掉, false 直接映射成 PHP 的 false。这份代码可以原封不动存成 config/app.php, config('app.limits.rate') 在运行时就能取到 5。

短语法 [] 还是 array()

两者产生的数组完全一样, [1, 2]array(1, 2) 在运行时是同一个值。短语法 [] 是 PHP 5.4 加入的, PSR-12 和 Laravel 到处在用, 是现代默认。只有当你必须支持还跑 PHP 5.3 的老代码, 或者团队规范强制要求时, 才需要切回 array()。其余情况让短语法开着就好, 更干净。

末尾逗号也建议打开。给数组每一行末尾都加逗号, 以后新增一行就只是一行干净的 Git diff, 不会因为补逗号而污染上一行。

和 json_decode 到底差在哪

很多人问, PHP 里不是有 json_decode($s, true) 吗, 为什么还要这个工具。区别在于使用场景。json_decode 是运行时把 JSON 字符串解析成内存里的数组变量, 你拿不到一段可以粘进源码的文本。而这个工具产出的是代码字面量, 是给你贴进 .php 文件的静态写法。

它俩的值是一致的, 这里输出的数组就是 json_decode($s, true) 在运行时会构造的那个。所以你可以放心地把抓到的 API 响应转成 PHP 数组当测试 fixture, 或者把一段 JSON 固化成配置文件, 而不用在代码里跑一遍解析。要把 JSON 喂给测试或迁移之前, 我一般先用 JSON 格式化工具 把输入理顺, 严格的 JSON.parse 不接受注释和末尾逗号, 先格式化能省掉一轮报错。

有一个不对称要记住: 空 JSON 对象 {} 和空 JSON 数组 [] 都会渲染成 [], 因为 PHP 没有单独的空映射字面量。如果下游必须看到关联形状, 你得至少给一个键, 或者在 PHP 里用 (object) 显式转换。

转义那些坑

字符串用单引号包裹, 只有两个字符特殊: 反斜杠变成 \\, 单引号变成 \'。所以 it's 输出成 'it\'s', Windows 路径 C:\Users 输出成 'C:\\Users', 给数据库做种子时 "O'Brien" 这种名字也不会让 seeder 第一次跑就挂掉。要注意单引号字符串里的 \n 是字面的反斜杠加 n, 不是换行, 这正是 PHP 单引号的规则。

如果你平时还要把 JSON 转成别的语言结构, 比如 JSON 转 TypeScript 接口, 思路是一样的: 跟着 JSON 形状走, 把对象映射成目标语言的等价写法。

整套操作都在浏览器里跑, JSON 不碰服务器, 配置里的凭据也不会外泄。把对的工具用在对的地方, 二十分钟手敲键的活, 三秒就出干净代码。完整功能见 JSON 转 PHP 数组


Made by Toolora · Updated 2026-06-13