
本文介绍使用 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);⚠️ 注意事项:
- 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() 校验,确保结构预期。
立即学习“PHP免费学习笔记(深入)”;
总之,parse_str() 是专为解析 URL 查询字符串而生的标准工具——简洁、健壮、符合 RFC 规范,应作为首选方案。










