我的页面上有一个文章列表,我希望能够通过将$ _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
所以简单地点击查询字符串就不会飞。
因此,构建我的过滤器链接的可扩展方法是什么,以便他们“记住”旧过滤器,但在需要时仍会覆盖自己的过滤器值?
答案 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_merge
或union 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