传递不断变化的查询字符串PHP

时间:2009-09-30 16:44:13

标签: php url get query-string

我的页面上有一个文章列表,我希望能够通过将$ _GET值附加到URL来应用无数种类和过滤器:

http://www.example.com/blogs.php?sort=newest&popularity=high&length=200

如果我的页面上有链接将这些值附加到网址上......他们需要足够智能,以便考虑以前应用的所有排序/过滤器。

示例1:

如果我现在有...... http://www.example.com/blogs.php?sort=newest

然后我想附加一个人气=高的额外过滤器,我需要这个:

http://www.example.com/blogs.php?sort=newest&popularity=high

而不是这个:

http://www.example.com/blogs.php?popularity=high

示例2:

如果我有...... http://www.example.com/blogs.php?popularity=high

我尝试改变我的人气过滤器,我不想要:

http://www.example.com/blogs.php?popularity=high&popularity=low

所以简单地点击查询字符串就不会飞。

因此,构建我的过滤器链接的可扩展方法是什么,以便他们“记住”旧过滤器,但在需要时仍会覆盖自己的过滤器值?

4 个答案:

答案 0 :(得分:9)

您可以将过滤器存储在关联数组中:

$myFilters = array(
                      "popularity" => "low",
                      "sort" => "newest"
);

将过滤器存储在关联数组中可确保每个过滤器只有1个值。然后,您可以使用http_build_query来构建查询字符串:

$myURL = 'http://www.example.com/test.php?' . http_build_query($myFilters);

这将产生以下网址:

http://www.example.com/test.php?popularity=low&sort=newest

编辑:哦,如果查询字符串中的过滤器顺序很重要,您可以在构建URL之前对关联数组进行排序:

asort($myFilters);
$myURL = 'http://www.example.com/test.php?' . http_build_query($myFilters);

答案 1 :(得分:2)

使用array_mergeunion operation将当前的GET变量与新变量结合使用:

$_GET = array('sort'=>'newest');

$params = array_merge($_GET, array('popularity'=>'high'));
// OR
$params = array('popularity'=>'high') + $_GET;

之后,您可以使用http_build_query或您自己的查询构建算法。

答案 2 :(得分:1)

执行此操作的最佳方法是手动编译查询字符串。例如:

$str = '?';
$str .= (array_key_exists('popularity', $_GET)) ? 'popularity='.$_GET['popularity'].'&' : '';
$str .= (array_key_exists('sort', $_GET)) ? 'sort='.$_GET['sort'].'&' : '';
// Your query string that you can tack on is now in the "str" variable.

答案 3 :(得分:0)

看起来您应该使用看起来像这样的签名来创建自己的函数:

函数writeLink($ baseURL,$ currentFilters,$ additionalFilters)

此函数可以确定其他过滤器是否应覆盖或删除$ currentFilters中的条目,然后它可以使用http_build_query

一次输出整个URL