
本文介绍如何使用 php 内置函数 `parse_str()` 将由 `http_build_query()` 生成的 url 参数字符串准确、安全地还原为关联数组,避免手动解析导致的键值分离错误或编码问题。
在 Web 开发中,常需将数组序列化为 URL 查询参数(如用于重定向、API 请求等),http_build_query() 是标准且可靠的工具。例如:
$approve = [
"approval" => 1,
"record" => $recordId,
"employee" => $userid
];
$queryString = http_build_query($approve);
// 输出示例:approval=1&record=8&employee=2但当需要反向解析该查询字符串(如从 $_SERVER['QUERY_STRING'] 或回调 URL 中提取参数)时,绝不可依赖 explode() + json_encode() 等手动拆分方式——这会丢失键名结构,且无法正确处理 URL 编码(如空格 → %20、中文、特殊符号等),导致数据损坏或安全风险。
✅ 正确做法是使用 PHP 原生函数 parse_str():
parse_str($queryString, $parsedArray); // $parsedArray 现在是一个关联数组,结构与原始数组一致: // [ // 'approval' => '1', // 'record' => '8', // 'employee' => '2' // ]
⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- parse_str() 会自动解码 URL 编码(如 %20 → 空格,%E4%B8%AD%E6%96%87 → “中文”),无需额外处理;
- 第二个参数必须是变量引用(无需 & 符号,函数内部自动赋值);
- 若未传入第二个参数,解析结果将注入当前作用域为全局变量(不推荐,易引发命名冲突);
- 解析后的值默认为字符串类型;如需整型/布尔型,需手动转换(例如 (int)$parsedArray['approval']);
- 它能正确处理嵌套数组语法(如 user[name]=John&user[age]=30),与 http_build_query() 行为完全兼容。
? 小技巧:若需转为 JSON,应在 parse_str() 后进行:
$json = json_encode($parsedArray, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
总结:parse_str() 是解析 URL 查询字符串的唯一推荐方案——它健壮、标准、安全,且与 http_build_query() 构成完整的序列化/反序列化闭环。摒弃字符串分割思维,拥抱语言原生能力,才能写出可维护、可扩展的 PHP 代码。











