PHP 7.1 中 json_encode() 对纯索引连续数组输出 JSON 数组([]),否则输出 JSON 对象({});确保输出数组需用 array_values() 重排键,强制输出对象则用 JSON_FORCE_OBJECT 标志。

PHP 7.1 中,json_encode() 对索引数组(即键为连续数字、从 0 开始)默认会编码为 JSON 数组;但只要数组中**存在非数字键**,或**键不连续**(如 [0 => 'a', 2 => 'b']),就会被转为 JSON 对象(即 {})。这不是 PHP 7.1 特有行为,而是 json_encode() 的一贯逻辑。
如何确保索引数组始终输出为 JSON 数组([])
关键在于:让数组满足「纯索引且连续」的结构,并在必要时手动重排键:
- 使用
array_values($arr)强制重置键为 0,1,2...(丢弃原键) - 避免在索引数组中混用字符串键(如
$arr['name'] = 'xxx') - 检查键是否连续:可用
array_keys($arr) === range(0, count($arr)-1)判断
如何强制将索引数组转为 JSON 对象({})
即使数组是纯索引的,也可通过以下方式“欺骗”json_encode 输出对象:
- 添加一个非数字键:
$arr['_dummy'] = null;,再用json_encode($arr) - 使用
JSON_FORCE_OBJECT标志:json_encode($arr, JSON_FORCE_OBJECT)—— 这是最直接、推荐的方式,PHP 5.3+ 支持,PHP 7.1 完全可用
常见误判场景与排查建议
你以为是索引数组,但实际不是:
立即学习“PHP免费学习笔记(深入)”;
-
unset($arr[0])后未调用array_values()→ 键变为[1=>'b', 2=>'c'],不再是连续索引 - 从数据库 fetch 出的关联结果(如
PDO::FETCH_ASSOC)天然带字符串键,必转为对象 - 使用
array_merge([1,2], ['x'=>3])会生成混合键数组,结果为对象
实用示例对比
// 纯索引连续数组 → 输出 []$a = [1, 2, 3]; echo json_encode($a); // [1,2,3]
// 非连续索引 → 输出 {}$b = [0=>1, 2=>3]; echo json_encode($b); // {"0":1,"2":3}
// 强制转对象 → 输出 {}$c = [1, 2, 3]; echo json_encode($c, JSON_FORCE_OBJECT); // {"0":1,"1":2,"2":3}
// 重排后恢复为数组 → 输出 []$d = [0=>1, 2=>3]; echo json_encode(array_values($d)); // [1,3]



















