2013-05-27 126 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