閱讀587 返回首頁    go iPhone_iPad_Mac_apple


一種根據URL參數條件動態生成URL的方法

最近做了一個產品列表頁類似於搜索列表頁, 功能比較簡單,比搜索頁複雜的邏輯在於,生成各個查詢條件的URL。
我們的鏈接如下:

https://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 >
 <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid']),'+');?>">
 <?php }else{?>
 <li >
 <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid']),'+');?>">
 <?php
     }}else{
 ?>
 <li >
 <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參數的方式和方法希望對大家有所啟發和幫助。

最後更新:2017-04-03 12:53:43

  上一篇:go uboot啟動後在內存中運行裸機程序hello
  下一篇:go Oracle中Lpad函數和Rpad函數的用法