【问题标题】:Add Querystring Variable with Multiple Values PHP添加具有多个值 PHP 的查询字符串变量
【发布时间】:2013-05-27 23:55:44
【问题描述】:

我找到了一些用于剥离查询字符串并向其添加新值的代码,但我希望能够使用一组选项来执行此操作。有人可以帮我修改这段代码吗?

当前代码:

function add_querystring_var($url, $key, $value) {
    $url = preg_replace('/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&');
    $url = substr($url, 0, -1);    
    $value = $value ? "=".urlencode($value) : '';    
    if (strpos($url, '?') === false)
        return ($url . '?' . $key . $value);
    else
        return ($url . '&' . $key . $value);
}

我希望它为给定的每个键和值执行一次 foreach,然后重建新的 url。

示例:add_querystring_var(curPageURL(), array("order","sort"), array("swn","DESC"))

所以我想要下面的 URL http://www.example.com/students 当通过上面的例子时会返回 http://www.example.com/students?order=swn&sort=DESC

有人知道我该怎么做吗?我是 PHP 领域的新手。 :)

更新: 我忘了提到有时 url 中可能有其他查询,所以我希望它替换我输入到数组中的那些。

示例 1:http://www.example.com/students?page=2 需要转换为 http://www.example.com/students?page=2&order=swn&sort=DESC

示例 2:http://www.example.com/students?page=2&order=name&sort=ASC 需要转换为 http://www.example.com/students?page=2&order=swn&sort=DESC

【问题讨论】:

  • 为什么不直接使用内置的http_build_query()函数呢?
  • @Barmar 我之前刚发现,但不知道在这种情况下如何使用它?有什么建议吗?

标签: php function foreach preg-replace


【解决方案1】:
  function add_querystring_var($url, $additions) {
    $parsed = parse_url($url);
    if (isset($parsed['query'])) {
        parse_str($parsed['query'], $query);
    } else {
        $query = array();
    }
    $parsed['query'] = http_build_query(array_merge($query, $additions));
    return http_build_url($parsed);
  }

这样使用:

$new_url = add_querystring_var($url, array('order' => 'swn', 'sort' => 'DESC'));

如果您收到错误消息指出 http_build_url 未定义,请参阅

PHP http_build_url() and PECL Install

【讨论】:

  • 谢谢,但没用?我刚刚得到一个错误。函数应该有add_querystring_var($url, &$additions) 而不是add_querystring_var($url, $additions)?但后来我收到一个错误Fatal error: Cannot pass parameter 2 by reference in
  • 为什么加法应该是参考参数?它不是在修改它。当原始 URL 没有查询字符串时,我已经解决了一个问题。
  • 我想我错过了什么?我收到错误Fatal error: Call to undefined function http_build_url()
  • 是的,我也明白了。我以为只是因为我没有安装可选的 PECL 包,所以希望它对你有用。
  • 谢谢,但现在这只是从结果中返回错误parse_url() expects parameter 1 to be string, array given
【解决方案2】:

你有点用那个功能重新发明轮子......首先,你最好在你的键/值数据上使用urlencode()而不是那个正则表达式(我看到你不是完全编码你的值字符串)

正如 dpDesignz 在他的评论中提到的 - 有一个可用的内置函数:http_build_query()

$querydata = array('foo' => array('bar', 'baz'),
          'baz'=>'boom',
          'cow'=>'milk',
          'php'=>'hypertext processor');

$querystring = http_build_query($data, '', '&');

或者,用你的例子:

$querydata = array("order" => "swn", "sort" => "DESC");
$url = curPageURL();
$concat = "?";
if (strpos($url, "?") !== false)) {
    $concat = "&"
}
$url .= $concat . http_build_query($data, '', '&');

【讨论】:

  • 感谢您,但我确实忘记提及我的网址中可能包含其他值。请查看我对我的问题的更新。
  • 为什么里面已经有值了?如果您正在构建参数,只需构建您的查询数据数组,然后在最后使用一次http_build_query() - 无论如何,我已经编辑了我的答案以解决这个警告
  • 你看到我的更新了吗?它正在提取我当前的 URL,并根据需要从中替换某些值,而不是全部替换。希望这是有道理的。 :)
  • 抱歉,我错过了 - 可能还有更好的方法,仍然 - 使用 $_SERVER['REQUEST_URI'] 获取没有查询字符串的 URI,并首先从 $_GET 启动 $querydata 数组。 ..
  • 谢谢,我就是这么想的。我已经写了几个小时的代码,但仍然无法将我的大脑包裹起来。 :)。
猜你喜欢
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多