
PHP 的 json_encode() 默认将关联数组转为 JSON 对象(花括号 {}),若需输出方括号数组 [],必须使用索引数组(如 [] 或 array() 无键形式),本文详解原理、写法及常见误区。
php 的 `json_encode()` 默认将关联数组转为 json 对象(花括号 `{}`),若需输出方括号数组 `[]`,必须使用索引数组(如 `[]` 或 `array()` 无键形式),本文详解原理、写法及常见误区。
在 PHP 中,json_encode() 的输出结构完全取决于输入数据的PHP 数组类型,而非变量名或业务语义。这是开发者常混淆的关键点:
- ✅ 索引数组(数字键、连续且从 0 开始) → 生成 JSON 数组 [...]
- ❌ 关联数组(字符串键,如 "firstName" => "rob") → 生成 JSON 对象 {...}
例如:
// 关联数组 → 输出 JSON 对象
$user = ["firstName" => "rob", "email" => "rob@example.com"];
echo json_encode($user);
// 输出: {"firstName":"rob","email":"rob@example.com"}
// 索引数组 → 输出 JSON 数组
$users = [
["firstName" => "rob", "email" => "rob@example.com"],
["firstName" => "alice", "email" => "alice@example.com"]
];
echo json_encode($users);
// 输出: [{"firstName":"rob","email":"rob@example.com"},{"firstName":"alice","email":"alice@example.com"}]回到原始问题:需求是让 "applicants" 字段值为 JSON 数组(即 [{...}]),而非 JSON 对象({...})。但初始代码中:
$data = [
"applicants" => [ // ← 这里仍是关联数组!键名隐式为字符串
"firstName" => $_POST["firstName"],
"lastName" => $_POST["lastName"],
// ...
],
// ...
];
// json_encode($data) → "applicants": { ... } (不是 [...]正确做法是显式构造索引数组,即用 [] 包裹单个申请人数据(即使只有一个):
$data = [
"applicants" => [ // ← 外层数组:索引数组(键为 0,1,2...)
[ // ← 内层:单个申请人,仍为关联数组,但整体是数组元素
"firstName" => $_POST["firstName"],
"lastName" => $_POST["lastName"],
"email" => $_POST["email"],
"telephone" => $_POST["telephone"]
]
],
"buyerType" => $_POST["buyerType"],
"organisationId" => "xxxxxxxxxx",
"introducerId" => "0",
// 其他字段...
];
$json = json_encode($data);
echo $json;
// 输出示例:
// {"applicants":[{"firstName":"rob","lastName":"shelford",...}],"buyerType":"Purchase"}? 验证技巧:使用 is_array($arr) && array_values($arr) === $arr 可判断是否为纯索引数组;更可靠的是 json_encode($arr) === '[]' || json_encode($arr)[0] === '['(仅作调试,勿用于生产逻辑)。
⚠️ 注意事项:
- 不要依赖 "\n" 等转义字符控制 JSON 结构——它仅影响输出换行,与数据类型无关;
- 避免混用键名:["0" => ..., "1" => ...] 是关联数组(字符串键),仍会编码为对象;应使用 [] 或 array(...) 让 PHP 自动分配数字索引;
- 如需强制转换,可用 $indexed = array_values($associativeArray) 清除键名;
- 始终校验 $_POST 数据是否存在与合法性(如 isset()、filter_input()),防止空值或注入风险。
总结:JSON 的方括号 [] 源于 PHP 的索引数组结构,而非语法糖或额外参数。理解并正确构建数组层级(外层索引 → JSON 数组;内层关联 → JSON 对象),是精准控制 API 请求体格式的核心能力。


















