在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 與數據交互方面的效率。