一种根据URL参数条件动态生成URL的方法

简介:

最近做了一个产品列表页类似于搜索列表页, 功能比较简单,比搜索页复杂的逻辑在于,生成各个查询条件的URL。
我们的链接如下:

http://xxx.xxx.xxx/product/list.html?spm=0.0.0.0.fCULEV&noHistoryApi=1&q=洗衣机&start_price=1300&end_price=2300&ppath=6560:98950,2814486;570:24403,2085950&sort=sort-fid&fid=3486
一些特点如下:
alt

比如品牌部分:

1:三洋的链接中,要在ppath现有的基础上去掉中的6560:98950

2:海尔的链接中,要在ppath现有的基础上增加6560:105540
同理在:
alt
这部分,都有做ppath的调整。

而对价格部分

1:1300-2300的选项,点击这项是,要在现有的url中去掉start_price和end_price方法。

2: 选择其他价格时,要把start_price和end_price调整为对应的价格。
alt
再比如这部分:

1:分类筛选部分,去过去掉三洋,迷你部分的筛选,都要去掉相关的筛选项,构建url。

2:比如点击 能耗低,需要把url中的去掉sort=sort-fid&fid=3486,而点击省水时,需要把fid调整为3386,如选择人气和销量时,需要把sort修改为static-score,并把fid去掉。

以上这些组合链接,还要加上分页的s参数变化,当修改为查询条件时,分页页码s,也要删除。

总结下:生成链接中,主要工作是从现有的URL逻辑中删除掉一些参数,或加上一些参数,或者修改某些参数中的一些参数。其中最复杂的是ppath,ppath要支持5670:1234,123;5690:xxx,xxx,需要支持:和,两种形式的组合,而这些组合要支持加减操作。

根据这些规则,我们封装了一个方法build_url_param,需要修改url部分,调用这个方法即可。

 <li class="item">
 <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid']),'+');?>">
 <?php }else{?>
 <li class="item-hidden">
 <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid']),'+');?>">
 <?php
     }}else{
 ?>
 <li class="item-checked">
 <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid'],'s'=>''),'-');?>">
 <?php } // end if?>

代码如上,build_url_param 构建查询url的参数部分,build_url_param第一个参数,传递一个数组,数组中传递相关参数,第二个参数"+"或者"-",“+”表示在现有URL中,加上第一个参数array中的key和对应的value;“-”表示从现有的URL中,减去第一个参数array中对应的key和value,使用以上方法后,所有生成url的部分,就变得非常简单了,只有知道当前连接,需要调整那些参数,是新增参数还是去掉参数即可。

build_url_param函数的实现如下:

/**
 * 根据QUERY构建url
 * $array: 传递参数,
 */

function build_url_param($array,$type){
    global $QUERY;

    $paramArray = array('q','start_price','end_price','cat','vid','ppath','sort','s','n','fid');

    $myArray = array();
    // 去掉不必要的参数
    foreach($paramArray as $key=>$value){
        // 放到myArray数组
        if(isset($QUERY[$value]) && !empty($QUERY[$value])){
            // n 不能小于10
            if($value == 'n'){
                if($QUERY[$value] < 10){
                    $myArray[$value] = '10';
                }
            }else{
                $myArray[$value] = $QUERY[$value];
            }
        }
    }
    // 构造最基本的
    if($type == '+'){
        // 加参数
        foreach($array as $key=>$value){
            $temp = array();
            // ppath特殊处理
            // pid相同时,pid:vid,vid; vid之间用,分割
            // pid不同时,pid:vid;分割
            // $value参数: pid:vid的形式
            if($key == 'ppath' && !empty($myArray[$key])){
                // 查找是否已经有此pid 
                $temp = $myArray[$key]; // 数组中的ppath
                $tempArray = explode(";",$temp);
                $tempPids = array();
                foreach($tempArray as $k=>$v){
                    list($tempPid,$tempVid) = explode(":",$v);
                    $tempPids[] = $tempPid;
                }
                $valueArray = explode(":",$value);
                // 找到
                if(isset($valueArray[0]) && stristr($temp,$valueArray[0]) != false && in_array($valueArray[0],$tempPids)){
                    $myArray[$key] = str_replace($valueArray[0].":",$value.",",$myArray[$key]);
                }else{
                    // 没有找到直接增加
                    $myArray[$key] = $myArray[$key].";".$value;
                }
            /*}elseif($key == 'fid'){
                if(!empty($myArray['fid'])){
                    $myArray['sort'] = "sort-fid";
                }
                $myArray[$key] = $value;
            */
            }elseif($key == 'sort'){
                unset($myArray['s']);
                $myArray[$key] = $value;
            }else{
                unset($myArray['s']);
                $myArray[$key] = $value;
            }
        }
    }else{
        // 减少参数
        foreach($array as $key=>$value){
            // 为空,去掉整个产生
            if(empty($value)){
                unset($myArray[$key]);
            }else{
                // 获取value
                $temp = $myArray[$key];
                // 单独处理ppath
                if($key == 'ppath'){
                    // 先找对应的pid,根据pid查找vid
                    if($value == $myArray[$key]){
                        unset($myArray[$key]);
                    }else{
                        // 数组,如果vid=0,删除所有的pid
                        $valueArray = explode(":",$value);
                        $ppathArray = explode(";",$myArray[$key]);
                        $t = array();
                        // ppath判断
                        if(isset($ppathArray[0])){
                            foreach($ppathArray as $inKey=>$inValue){
                                // 直接去掉
                                if($inValue != $value){
                                    //单条记录path
                                    $inValueArray = explode(":",$inValue);
                                    // pid相同
                                    if($inValueArray[0] == $valueArray[0]){
                                        // 删除vid
                                        $temp = str_replace(','.$valueArray[1],'',$inValueArray[1]); // 末尾
                                        $temp = str_replace(':'.$valueArray[1],'',$temp); // 开头
                                        $temp = str_replace($valueArray[1].',','',$temp); // 中间
                                        // 第二条件,用于删除所有pid下的所有数据
                                        if(!empty($temp) && $temp != $inValueArray[1]){
                                            // 删除后的数据进入t数组
                                            $t[] = implode(":",array($inValueArray[0],$temp));
                                        }
                                    }else{
                                        $t[] = $inValue;
                                    }
                                }
                            }
                        }
                        // 处理后的数组,赋值给ppath
                        if(count($t)){
                            $myArray[$key] = implode(";",$t);
                        }
                    }
                }else{
                    // 删除里面信息
                    $myArray[$key] = str_replace($value,'',$temp);
                }
            }
        }
    }
    // 构造一段param
    return http_build_query($myArray);
}


代码写的比较糙,有时间再细化下,关键是build参数的方式和方法希望对大家有所启发和帮助。

目录
相关文章
|
11天前
|
JavaScript
vue截取URL中的参数
vue截取URL中的参数
12 0
|
2月前
|
前端开发
[牛客网-前端大挑战QD2] 获取url参数
[牛客网-前端大挑战QD2] 获取url参数
19 0
|
2月前
BurpSuite8.2 -- 查找包含id参数的URL
BurpSuite8.2 -- 查找包含id参数的URL
18 1
|
2月前
|
分布式计算 DataWorks 关系型数据库
DataWorks数据源问题之参数“连接Url”如何解决
DataWorks数据源是指DataWorks中配置的用于数据集成的外部数据源;本合集将讲解如何在DataWorks中配置和管理数据源,以及处理数据源连接和集成过程中的问题。
29 5
|
3月前
Copy网页中F12里的请求url到postman,并且把所有参数都带过来
Copy网页中F12里的请求url到postman,并且把所有参数都带过来
29 0
|
2月前
feign使用url参数传参@SpringQueryMap使用
feign使用url参数传参@SpringQueryMap使用
32 0
|
10天前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
|
10天前
|
JavaScript
【归总】原生js操作浏览器hash、url参数参数获取/修改方法合集
【归总】原生js操作浏览器hash、url参数参数获取/修改方法合集
|
1月前
|
前端开发 JavaScript
|
2月前
|
缓存 开发者 UED
关于 PWA url 参数 ngsw-bypass=true
关于 PWA url 参数 ngsw-bypass=true
23 0