2015-07-21 100 views
0

我有以下方法:更改查詢參數和返回URL

public static function replaceSlug($name, $value) 
{ 
    $fullUrl = self :: getFullUrl(); 
    $queryString = parseUrl($fullUrl, PHP_URL_QUERY); 

    $slugs = array(); 
    parse_str($queryString, $slugs); 

    foreach ($slugs as &$slug) { 
     if ($slug == $name) { 
     if ($value == null) { 
      unset($slug); 
     } else { 
      $slug = $value; 
     } 
     } 
    } 

    return ''; // what to return? 
} 

我用兩個參數調用它 - 查詢參數更改的名稱,它會被改變的值。如果這個值爲空,我想刪除這個查詢參數。

我該怎麼做?

+1

剛剛重建查詢字符串['http_build_query()'](http://php.net/manual/en/function.http-build-query.php),並返回字符串。 – D4V1D

回答

0

你必須從$蛞蝓陣列重建參數:

$res = ""; 
foreach($slugs as $slug) 
    $res .= $slug . "&"; 
$res = substr($res, -1); /// removes the last & 
... 
//concatenate $res with the other parts of your URL getting them from your 
//parseUrl function, i.e., the http, host, and path parts from url except the 
//PHP_URL_QUERY part. This has already came from the code above. 
... 
return $res 
+0

**不使用'http_build_query()'函數的具體原因是什麼? – D4V1D

+1

是的。這是世界上最好的具體原因:我不知道這個功能:D –

+1

你永遠不會老去學習:) – D4V1D

1

你不知道該怎麼回報雖然你的問題的標題是:

更改查詢參數和回網址

所以,如果你想返回的URL只是做:

return $fullUrl . '?' . http_build_query($slugs); 

如果,當然,$fullUrl存儲URL主機和路徑沒有查詢字符串(你會手動追加)。

+0

是不是$ fullUrl充滿舊的查詢刺痛? – DavidDomain

+0

這確實是最有可能的,但我不知道OP的函數'parseUrl()'和什麼是第二個參數來檢索沒有查詢字符串的主機/路徑。 – D4V1D

+1

這很有道理。僅僅因爲我認爲它應該是什麼,它可能實際上是完全不同的東西。 ;-) +1 – DavidDomain

0

只需引用數組,以便foreach不在數組的副本上運行。

foreach

爲了能夠直接修改環路上一頁$值內的數組元素與&。在這種情況下,該值將通過引用進行分配。

然後用http_build_query重建您的查詢。

http_build_query

生成從締合(或索引)陣列提供的URL編碼的查詢串。

<?php 
function replaceSlug($name, $value) 
{ 
    //$fullUrl = self :: getFullUrl(); 
    //$queryString = parseUrl($fullUrl, PHP_URL_QUERY); 

    // just faking the query str here. Put the above back in 
    // and delete this one. 
    $queryString = "foo=bar&baz=boo&boogaloo="; 

    $slugs = array(); 
    parse_str($queryString, $slugs); 

    foreach ($slugs as $n => & $v) { 
     if ($n == $name) { 
      if (strlen($slugs[$n]) == 0) { 
       unset($slugs[$n]); 
      } else { 
       $slugs[$n] = $value; 
      } 
     } 
    } 

    $splitUri = explode('?', $_SERVER['REQUEST_URI'], 2); 

    return 'http://' . $_SERVER['HTTP_HOST'] . $splitUri[0] 
     . "?" . http_build_query($slugs); // returns full url with a new query string 
} 

$result = replaceSlug('foo', 'oof'); 
echo "<pre>"; 
var_dump($result); 
echo "</pre>"; 
$result = replaceSlug('boogaloo', 'oolagoob'); 
echo "<pre>"; 
var_dump($result); 
echo "</pre>";