2015-07-21 84 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>";