
本文介绍使用 php 内置函数 `parse_str()` 将 `http_build_query()` 生成的 url 参数字符串准确还原为原始关联数组,避免手动分割导致的键值解析错误。
在 Web 开发中,我们常通过 http_build_query() 将关联数组序列化为标准的 URL 查询字符串(如 approval=1&record=8&employee=2),用于构造跳转链接或 API 请求参数。但当需要从该字符串反向还原为 PHP 数组时,切勿使用 explode('&', $str) 配合 json_encode()——这种方式仅得到带等号的字符串片段数组(如 ["approval=1", "record=8"]),完全丢失了键值对结构,也无法正确处理 URL 编码、空格、特殊字符(如 +、%20、& 在值中)等边界情况。
✅ 正确且唯一推荐的方式是使用 PHP 原生函数:parse_str()。
// 假设这是你通过 http_build_query 生成的查询字符串
$approve = http_build_query([
"approval" => 1,
"record" => $recordId, // 例如 8
"employee" => $userid, // 例如 2
"hod" => 9
]);
// $approve 的值示例: "approval=1&record=8&employee=2&hod=9"
// 安全、标准、自动解码地还原为关联数组
parse_str($approve, $array);
// 此时 $array 即为原始结构:
// [
// 'approval' => '1',
// 'record' => '8',
// 'employee' => '2',
// 'hod' => '9'
// ]
print_r($array);
⚠️ 注意事项:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- parse_str() 会自动对 URL 编码内容进行解码(如 %20 → 空格,+ → 空格),无需额外调用 urldecode();
- 第二个参数 $array 是引用传参,函数本身无返回值,务必传入一个变量名;
- 若需转换为 JSON,可在解析后使用 json_encode($array),而非对原始字符串操作;
- 不要省略第二个参数(即不要写 parse_str($approve)),否则解析结果将注入到当前作用域的变量中(如 approval、record 变量),存在安全隐患和命名冲突风险。
? 扩展提示:若需兼容更复杂的嵌套数组(如 user[name]=John&user[age]=30),parse_str() 同样支持(PHP 7.2+ 默认启用 PHP_INI_SYSTEM 兼容模式),但建议对关键业务数据做 is_array() 和 isset() 校验,确保结构预期。
总之,parse_str() 是专为解析 URL 查询字符串而生的标准工具——简洁、健壮、符合 RFC 规范,应作为首选方案。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










