转载请注明出处,如有问题请联系我们! PHP 数组转 URL 参数字符串:常见写法和使用场景

PHP 数组转 URL 参数字符串:常见写法和使用场景 这篇文章讲的是一个看似简单但非常常用的 PHP 技巧:把数组转换成 URL 查询参数。它常用于搜索页筛选、接口请求、支付回调、分页链接、第三方 API 对接等场景。

一、最推荐的方法:http_build_query

PHP 自带的 http_build_query 可以把数组自动转换成 URL 参数字符串。

$params = [
    "keyword" => "源码",
    "page" => 1,
    "type" => "article"
];

$query = http_build_query($params);
echo $query;

输出结果类似:

keyword=%E6%BA%90%E7%A0%81&page=1&type=article

二、拼接成完整 URL

$url = "/search.html?" . http_build_query($params);
echo $url;

在搜索页面、筛选页面里,这种写法比手动拼接更安全,不容易漏掉 & 或编码。

三、中文为什么会被编码

URL 里不能直接随意放中文,浏览器会把中文转成编码格式。比如“源码”会变成:

%E6%BA%90%E7%A0%81

这是正常现象。服务端接收参数时,PHP 会自动解析回来。

$keyword = $_GET["keyword"] ?? "";
echo $keyword;

四、多维数组怎么处理

如果数组里还有数组,http_build_query 也能处理:

$params = [
    "filter" => [
        "category" => "php",
        "level" => "basic"
    ],
    "page" => 2
];

echo http_build_query($params);

输出会类似:

filter%5Bcategory%5D=php&filter%5Blevel%5D=basic&page=2

这种格式适合内部系统,但如果对接第三方接口,要确认对方是否支持这种数组格式。

五、接口签名场景

很多支付接口或开放平台要求先把参数排序,再拼接字符串生成签名。这时不能直接随便 http_build_query,应该先排序。

$params = [
    "amount" => "100.00",
    "order_no" => "YS20260520001",
    "timestamp" => time()
];

ksort($params);

$string = http_build_query($params);
$sign = md5($string . "secret_key");

注意:不同接口对编码方式、空值、签名字段是否参与计算要求不同,必须看接口文档。

六、过滤空参数

有些场景不希望把空值传到 URL,可以先过滤:

$params = array_filter($params, function($v){
    return $v !== "" && $v !== null;
});

$query = http_build_query($params);

七、常见错误

  • 手动拼接忘记 urlencode:中文或特殊符号会出错。
  • 签名时参数顺序不一致:导致接口验签失败。
  • 空值参与签名:和接口文档不一致。
  • 数组格式对方接口不支持:需要改成 JSON 或指定格式。
  • 把敏感信息放 URL:密码、Token 不建议放 GET 参数。

八、实际应用:筛选链接保留条件

比如用户已经选择分类和关键词,点击下一页时要保留筛选条件:

$query = http_build_query([
    "keyword" => $_GET["keyword"] ?? "",
    "category" => $_GET["category"] ?? "",
    "page" => $nextPage
]);

echo "/search.html?" . $query;

九、总结

PHP 数组转 URL 参数最稳妥的方法是使用 http_build_query。普通链接拼接、搜索筛选、接口请求都可以用它;涉及签名时,要额外注意排序、编码和空值规则。

标签云