
当 php 数组使用非连续字符串数字键(如 `"1"`、`"2"`)时,可使用 `array_values()` 重置为从 0 开始的连续整数索引,从而消除原始键名并确保 json 序列化输出为标准数组而非对象。
在 PHP 中,数组的键类型直接影响其 JSON 编码行为:若键为连续的整数索引(如 0, 1, 2),json_encode() 会将其序列化为 JSON 数组([]);而若键为字符串数字(如 "1", "2")或不连续整数(如 1, 3),PHP 会将其视为关联数组,json_encode() 将输出 JSON 对象({})——这常导致前端解析失败或结构不符合预期。
针对你的示例:
$response = [
"example" => [
"1" => ["name" => "stan", "city" => "NY"],
"2" => ["name" => "wilson", "city" => "FL"]
]
];直接 json_encode($response) 会产生:
{"example":{"1":{"name":"stan","city":"NY"},"2":{"name":"wilson","city":"FL"}}}⚠️ 此处 "example" 的值是一个对象(因键 "1"/"2" 是字符串),而非期望的数组。
立即学习“PHP免费学习笔记(深入)”;
✅ 正确做法是:对目标子数组调用 array_values() 重置键:
$response['example'] = array_values($response['example']); echo json_encode($response, JSON_PRETTY_PRINT);
输出结果变为:
{
"example": [
{"name": "stan", "city": "NY"},
{"name": "wilson", "city": "FL"}
]
}? 补充说明:
- array_values() 仅重置键,不改变值顺序或内容,安全可靠;
- 若原数组含混合键(如 "1", "abc", 3),array_values() 仍会统一转为 0, 1, 2…;
- 不要误用 array_merge($arr)(虽效果类似,但语义不清且有性能开销);
- 如需深度处理嵌套结构(多层索引数组),需递归调用或结合 array_map()。
总结:array_values() 是标准化 PHP 数组索引、确保 JSON 兼容性的首选工具——简洁、高效、无副作用。











