2013-02-26 24 views
0

我有一個php工作代碼,其中我使用了一個包含全部URL的數組,我使用preg_match來獲取URL中的所有信息,例如典型的url如下所示:如何通過使用php和preg_match的url中的ID進行排序

http://photos.com/path=images&user=Ron197&userid=970965&hue=soft

要匹配我用這個foreach循環內的用戶ID:

preg_match_all('/userid=(.+?)&hue/', $linklong, $userid); 
     $userid = $userid[1][0]; 
     //print_r($userid); 

主陣列按字母順序具有超過600頁的URL排序並顯示就好像,但我我也試圖展示這個環境按用戶ID排序的URL列表。

誰能幫助,至少讓我開始我嘗試使用kso​​rt,usort,但老實說,我不明白的邏輯背後的想法是,linklong需要由用戶標識重新排列

+0

是否每個用戶標識在你的URL集中都是唯一的,或者你有一些重複的東西?如果沒有愚蠢的話,我會建議使用你已經提取的方法建立一個由userid建立索引的數組。 '$ arr [$ userid] = $ linklong;'然後調用'ksort()'。 – 2013-02-26 03:51:33

+0

它們都是唯一的 – user1294097 2013-02-26 03:52:47

+2

parse_url(),應該使用parse_str()而不是正則表達式 – 2013-02-26 03:53:51

回答

1

首先,你應該使用parse_url來提取你的'查詢'部分。然後,使用parse_str,可以分離所有參數。

這可以讓你檢查你的URL是否有效。

然後,如果您希望能夠在任何需要的字段(而不僅僅是在userId)上對數組進行排序,您只需創建一個回調函數,該函數將採用數組中的2個元素並返回-1, 0或1,如果第一個元素是<,那麼比第二個元素大。

然後,訂購您的數組,你只需要調用函數usort

bool usort (array &$array , callable $cmp_function) 

給您的數組作爲第一個參數和您的回調函數作爲第二個參數。 這使您可以創建任何想要的比較回調,並按照您的要求排列陣列。

注意:保證性能..如果你的回調做了很多事情,那麼排序需要一些時間,因爲回調函數在數組元素之間被稱爲很多時間,遵循特定的排序算法(像冒泡類)。

這樣一個比較函數的例子:

function compareUrlCustom($u1, $2) 
{ 
    // Parse the 2 URLs 
    $urlParts1 = parse_url($u1); 
    $urlParts2 = parse_url($u2); 

    // Extract and parse the 2 query parts 
    $queryParts1 = array(); 
    $queryParts2 = array(); 
    parse_str($urlParts1['query'], $queryParts1); 
    parse_str($urlParts2['query'], $queryParts2); 

    // Return 1, O or -1 as comparision value 
    if ($queryParts1['userId'] > $queryParts2['userId']) 
     return 1; 
    else if ($queryParts2['userId'] > $queryParts1['userId']) 
     return -1; 
    else 
     return 0; 
} 

然後,你可以調用排序的數組的:

$wellSorted = usort($yourArray, compareUrlCustom); 

,並檢查$wellSorted知道,如果排序操作是成功與否。

注意:您應該在compareUrlCustom函數中添加一些檢查以確保具有有效的URL,並且如果不是這種情況,最終會拋出異常。

相關問題