PHP数组转查询字符串怎么写
发布:smiling 来源: PHP粉丝网 添加日期:2026-09-12 11:29:49 浏览: 评论:0
http_build_query()是PHP专用URL参数生成函数,自动处理编码、嵌套数组、空值及特殊字符;基础用法如http_build_query(['name'=>'张三']),支持多层嵌套与自定义分隔符,但布尔值和数字索引需注意默认行为。
PHP里用 http_build_query() 最省事
直接调用 http_build_query() 就能搞定,它专为这个设计,会自动处理 URL 编码、嵌套数组、空值和特殊字符。别自己拼字符串或用 implode(),容易漏转义或破坏格式。
常见错误现象:手动拼接时没对键名和值做 urlencode(),导致中文、空格、& 符号出错;或者嵌套数组直接被转成 Array 字符串。
基础用法:http_build_query(['name' => '张三', 'age' => 25]) → name=%E5%BC%A0%E4%B8%89&age=25
嵌套数组也支持:http_build_query(['user' => ['id' => 1, 'tag' => ['a', 'b']]]) → user[id]=1&user[tag][0]=a&user[tag][1]=b
注意默认使用 & 分隔符,如需改用 ;(少见),传第四个参数:http_build_query($arr, '', ';')
什么时候不能用 http_build_query()?
主要两种情况:要兼容 PHP
这时得手写,但别从零造轮子——先用 array_filter() 清理数据,再逐对处理键值:
过滤掉 null 和空字符串:$clean = array_filter($arr, function($v) { return $v !== null && $v !== ''; });
手动编码每个键值:urlencode($key).'='.urlencode($value),别漏掉键名
避免用 rawurlencode(),它编码更多字符(如 /、.),不符合标准查询字符串规范
http_build_query() 的坑:布尔值、数字索引、空数组
它的行为不是完全直觉的,尤其在边缘 case 上容易踩中:
布尔值 true → 1,false → 空字符串(不是 0),如果后端依赖 false 显式传递,得提前转成 '0' 或 'false'
纯数字索引数组(如 [10, 20])会被转成 0=10&1=20,而不是你想的 10&20;若需扁平化值列表,先用 array_values() 再处理
空数组 [] 返回空字符串,不是 "",但有些接口要求显式传 arr=,就得手动补
POST 请求体里用 http_build_query() 要配对设置 header
如果把结果当 POST body 发送(比如 curl 或 file_get_contents()),光有字符串不够,必须声明 Content-Type:
缺 header 会导致后端收不到 $_POST,只在 php://input 里看到原始数据
正确做法:stream_context_create(['http' => ['method' => 'POST', 'header' => "Content-Type: application/x-www-form-urlencoded\r\n", 'content' => http_build_query($data)]])
用 curl 时设 curl_setopt($ch, CURLOPT_POSTFIELDS, $data) 更安全——cURL 会自动识别数组并调用 http_build_query(),还能处理文件上传
最常被忽略的是布尔值转换和数字索引数组的默认行为,线上出问题往往卡在这两处,调试时建议先 var_dump(http_build_query($your_arr)) 看一眼实际输出,比猜快得多。
Tags: PHP数组转查询字符串怎么写
- 上一篇:PHP serialize 怎么把数组转成字符串
- 下一篇:最后一页
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)
