2013-05-27 88 views
0

我发现了一些剥离查询字符串并向其中添加新值的代码,但我希望能够通过一组选项来执行此操作。有人能帮我修改这段代码吗?添加带有多个值的查询字符串变量PHP

当前代码:

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"))

所以我想下面的网址http://www.example.com/students通过例如把上面的时候会返回http://www.example.com/students?order=swn&sort=DESC

有谁知道我能做到这一点?我是这个PHP领域的新手。 :)

UPDATE: 我忘了提有时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

+0

为什么不使用内建的'http_build_query()'函数? – Barmar

+0

@Barmar我刚刚发现之前,但不知道如何在这种情况下使用它?有什么建议么? – dpDesignz

回答

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

+0

谢谢,但没有奏效?我刚刚得到一个错误。该函数是否应该有'add_querystring_var($ url,&$ additions)'而不是'add_querystring_var($ url,$ additions)'?但是然后我得到一个错误'致命错误:不能通过引用在'中传递参数2。 – dpDesignz

+0

为什么添加项是参考参数?它不会修改它。当原始网址没有查询字符串时,我解决了一个问题。 – Barmar

+0

我想我错过了什么?我得到错误'致命错误:调用未定义的函数http_build_url()' – dpDesignz

0

你样的重塑与功能车轮......第一关,你会用你的键/值数据,而不是正则表达式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, '', '&'); 
+0

感谢这一点,但我忘了提及我的网址可能有其他值。请参阅我的问题更新。 – dpDesignz

+0

它为什么已经有它的价值?如果你正在构建参数,只需构建你的查询数据数组,然后在最后使用'http_build_query()' - 无论如何,我已经编辑了我的答案来解决这个警告 – HorusKol

+0

你有没有看到我的更新?这是拉我目前的网址,并根据需要替换它的某些值,而不是全部。希望这是有道理的。 :) – dpDesignz