在 PHP 开发中,我们经常会处理 URL 查询字符串(Query String)与数组之间的相互转换。比如,在前端通过表单提交的数据会以查询字符串的形式传递到后端,而在后端处理过程中,常常需要将其转换为数组来操作数据;相反,在构建 URL 时又需要将数组转换回查询字符串。
PHP 为我们提供了两个非常方便的函数:http_build_query 和 parse_str,用于实现这一功能。
http_build_query 函数可以将一个数组转换成 URL 编码的查询字符串。常用于构造 GET 请求的参数。
<span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-title function_ invoke__">http_build_query</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$numeric_prefix</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>, ?</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$arg_separator</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$encoding_type</span></span><span> = PHP_QUERY_RFC1738)
</span></span>
<span><span><span class="hljs-variable">$params</span></span><span> = [
</span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'张三'</span></span><span>,
</span><span><span class="hljs-string">'age'</span></span><span> => </span><span><span class="hljs-number">25</span></span><span>,
</span><span><span class="hljs-string">'hobbies'</span></span><span> => [</span><span><span class="hljs-string">'reading'</span></span><span>, </span><span><span class="hljs-string">'coding'</span></span><span>]
];
</span><span><span class="hljs-variable">$queryString</span></span><span> = </span><span><span class="hljs-title function_ invoke__">http_build_query</span></span><span>(</span><span><span class="hljs-variable">$params</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$queryString</span></span><span>;
</span></span>
<span><span>name=%E5%BC%A</span><span><span class="hljs-number">0</span></span><span>%E4%B8%89&age=</span><span><span class="hljs-number">25</span></span><span>&hobbies%5B</span><span><span class="hljs-number">0</span></span><span>%5D=reading&hobbies%5B1%5D=coding
</span></span>
注意:默认情况下,数组会被序列化为带下标的格式,比如 hobbies[0]=reading&hobbies[1]=coding。
如果需要自定义分隔符或编码方式,可以使用额外的参数进行控制。例如,将分隔符改为分号:
<span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">http_build_query</span></span><span>(</span><span><span class="hljs-variable">$params</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>, </span><span><span class="hljs-string">';'</span></span><span>);
</span></span>
输出结果:
<span><span>name=%E5%BC%A</span><span><span class="hljs-number">0</span></span><span>%E4%B8%89;age=</span><span><span class="hljs-number">25</span></span><span>;hobbies%5B</span><span><span class="hljs-number">0</span></span><span>%5D=reading;hobbies%5B1%5D=coding
</span></span>
parse_str 函数可以将 URL 查询字符串解析为数组或变量,常用于解析 GET 请求或自定义字符串。
<span><span><span class="hljs-keyword">void</span></span><span> </span><span><span class="hljs-title function_ invoke__">parse_str</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> &</span><span><span class="hljs-variable">$result</span></span><span>)
</span></span>
<span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">'name=%E5%BC%A0%E4%B8%89&age=25&hobbies%5B0%5D=reading&hobbies%5B1%5D=coding'</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">parse_str</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>, </span><span><span class="hljs-variable">$output</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$output</span></span><span>);
</span></span>
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[name] => 张三
[age] => </span><span><span class="hljs-number">25</span></span><span>
[hobbies] => </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[</span><span><span class="hljs-number">0</span></span><span>] => reading
[</span><span><span class="hljs-number">1</span></span><span>] => coding
)
)
</span></span>
注意:parse_str 默认会将变量赋值到当前作用域中,如果第二个参数未提供,则变量将以变量名形式出现在当前作用域中,这在某些情况下可能导致变量覆盖,因此推荐始终提供第二个参数作为目标数组。
前端表单模拟:将数组转换为查询字符串,模拟 GET 请求。
URL 重写与跳转:在生成动态 URL 时构建参数。
接口请求:在发送 API 请求时拼接参数。
参数调试工具:用于构建参数字符串或解析调试返回。
通过 http_build_query 和 parse_str,我们可以轻松实现数组与 URL 查询字符串之间的相互转换。这两个函数不仅简单易用,而且功能强大,是日常 PHP 开发中处理参数传递不可或缺的工具。掌握它们,可以大大提高我们在处理 URL 与数据交互方面的效率。