如何在 PHP 响应中移除数组的非连续数字键(重置为连续数字索引)

当 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 兼容性的首选工具——简洁、高效、无副作用。