使用json_encode处理多维数组时,如何在JSON中传递单个元素为元素数组?
我懂你遇到的这个痛点——有时候用json_encode处理多维数组时,某个本应是数组的字段(比如示例里的invoice_lines)如果只有单个元素,很容易被转成单个对象而非数组结构,不符合接口要求。下面就给你一步步搞定的方法:
核心思路
要让JSON里的字段始终是数组形式,关键是在PHP端构造数据时,就把对应的子元素包裹成数组,哪怕只有一个元素。
具体实现方法
1. 手动构造数据时直接包裹数组
如果你是手动组装数据,直接把单个元素放到数组里就行,比如:
// 正确写法:哪怕只有一条invoice_line,也要用[]包裹 $invoice_lines = [ [ 'quantity' => 1, 'concept' => 'Renovar Dominio - xxx.org - 1 Año(s) (22/03/2018 - 21/03/2019) + Protección de ID', 'amount' => 13.15, 'discount' => 0, 'tax' => 21, 'retention' => 0 ] ]; // 组装完整数据结构 $data = [ 'issued' => true, 'customer' => 451071, 'invoice_lines' => $invoice_lines ]; // 生成符合要求的JSON $json = json_encode($data, JSON_PRETTY_PRINT);
2. 处理动态数据(比如数据库查询结果)
如果数据是动态获取的(比如从数据库查询,可能返回单条或多条结果),要先判断结果类型,再处理:
// 假设$db_result是从数据库拿到的结果,可能是单条记录(一维数组)或多条(二维数组) if (!is_array($db_result) || !isset($db_result[0])) { // 如果是单条记录,包裹成数组 $invoice_lines = [$db_result]; } else { // 多条记录直接用原数组 $invoice_lines = $db_result; } // 再组装到主数据里 $data = [ 'issued' => true, 'customer' => 451071, 'invoice_lines' => $invoice_lines ]; $json = json_encode($data);
验证结果
运行上面的代码后,生成的JSON就会和你给出的示例一致:
{
"issued": true,
"customer": 451071,
"invoice_lines": [
{
"quantity": 1,
"concept": "Renovar Dominio - xxx.org - 1 Año(s) (22/03/2018 - 21/03/2019) + Protección de ID",
"amount": 13.15,
"discount": 0,
"tax": 21,
"retention": 0
},
{
"quantity": 1,
"concept": "Renovar Dominio - xxx.net - 1 Año(s) (22/03/2018 - 21/03/2019) + Protección de ID",
"amount": 12.73,
"discount": 0,
"tax": 21,
"retention": 0
}
]
}
常见坑点提醒
- 从数据库查询时,别用
fetch()(返回单条),如果预期是数组结构,哪怕单条也要用fetchAll(),或者手动把fetch()的结果包裹成数组。 - 不要依赖
json_encode的自动转换,PHP里的数组结构直接决定了JSON的结构,所以源头处理是最稳妥的。
内容的提问来源于stack exchange,提问作者abkrim

