在PHP中,将数组转换为URL查询字符串或反向操作,主要通过http_build_query()和parse_str()函数实现。以下是具体方法及注意事项:
一、数组转URL查询字符串使用http_build_query()函数,将数组编码为URL查询字符串(自动处理特殊字符编码,如空格转为+)。
$data = ['name' => 'John Doe', 'age' => 30];$query_string = http_build_query($data);// 输出:name=John+Doe&age=30$data = [ 'person' => ['name' => 'John', 'age' => 30], 'address' => ['city' => 'NY']];echo http_build_query($data); // 输出:person%5Bname%5D=John&person%5Bage%5D=30&address%5Bcity%5D=NY// 使用前缀和自定义分隔符echo http_build_query($data, 'prefix_', '&');// 输出:prefix_person[name]=John&prefix_person[age]=30&...二、URL查询字符串转数组使用parse_str()函数,将查询字符串解析为关联数组。
$query_string = 'name=John&age=30';parse_str($query_string, $output);// $output = ['name' => 'John', 'age' => 30]- 处理特殊字符:解析后需用urldecode()解码值(避免直接解码原始字符串)。
$query_string = 'name=John%20Doe&email=test%40example.com';parse_str($query_string, $data);foreach ($data as $key => $value) { $data[$key] = urldecode($value);}// $data = ['name' => 'John Doe', 'email' => 'test@example.com']- 数组参数处理:使用[]语法保留同名键的所有值,否则仅保留最后一个。
$query_string = 'ids[]=1&ids[]=2&name=Alice';parse_str($query_string, $data);// $data = ['ids' => [1, 2], 'name' => 'Alice']// 无[]语法时,仅保留最后一个值$query_string = 'name=Alice&name=Bob';parse_str($query_string, $data);// $data = ['name' => 'Bob']三、完整示例1. 数组转查询字符串$data = [ 'user' => ['name' => 'Alice', 'age' => 25], 'tags' => ['php', 'web']];$query_string = http_build_query($data);echo $query_string;// 输出:user%5Bname%5D=Alice&user%5Bage%5D=25&tags%5B0%5D=php&tags%5B1%5D=web2. 查询字符串转数组$query_string = 'user[name]=Alice&user[age]=25&tags[]=php&tags[]=web';parse_str($query_string, $data);// 解码特殊字符(如空格、@等)foreach ($data as $key => $value) { if (is_string($value)) { $data[$key] = urldecode($value); } elseif (is_array($value)) { array_walk_recursive($value, function (&$item) { $item = urldecode($item); }); }}print_r($data);/*输出:Array( [user] => Array ( [name] => Alice [age] => 25 ) [tags] => Array ( [0] => php [1] => web ))*/四、关键总结掌握这两个函数即可高效处理PHP数组与URL查询字符串的转换,但需注意编码规范、键名冲突及URL长度限制等问题。