
本文介绍使用 php 内置函数 `parse_str()` 将由 `http_build_query()` 生成的 url 参数字符串准确还原为原始关联数组,避免手动分割导致的键值解析错误。
在 Web 开发中,常通过 http_build_query() 将关联数组序列化为标准 URL 查询字符串(如 approval=1&record=8&employee=2),便于拼接至 URL 或作为表单数据提交。但当需要反向解析该字符串(例如从回调 URL、日志记录或 API 请求体中还原参数)时,绝不可依赖 explode('&') + json_encode() 等粗暴方式——这仅得到带等号的字符串数组,完全丢失键值结构与类型信息。
正确且安全的方式是使用 PHP 原生函数 parse_str():
$approve = ["approval" => 1, "record" => $recordId, "employee" => $userid]; $queryString = http_build_query($approve); // 例如:"approval=1&record=8&employee=2" // ✅ 正确:解析为关联数组 parse_str($queryString, $parsed); print_r($parsed); // 输出: // Array ( // [approval] => 1 // [record] => 8 // [employee] => 2 // )
⚠️ 注意事项:
- parse_str() 会自动 URL 解码(如 %20 → 空格、%E4%BD%A0 → 中文),无需额外调用 urldecode();
- 第二个参数 $result 是引用传参,必须显式传入变量名(如 $parsed),否则解析结果将存入全局变量(已废弃行为,PHP 8.1+ 报警告);
- 若需转为 JSON,应在解析后操作:json_encode($parsed, JSON_UNESCAPED_UNICODE);
- 不要对已编码的字符串重复解码,parse_str() 已内置处理;若原始值含特殊字符(如 &, =),http_build_query() 已正确编码,parse_str() 可精准还原。
总结:parse_str() 是专为解析 application/x-www-form-urlencoded 格式设计的标准方案,语义清晰、健壮可靠,应作为 URL 查询字符串反序列化的唯一推荐方式。
立即学习“PHP免费学习笔记(深入)”;











