2011-04-11 57 views
7

因此,如果我想按字母順序組織網站列表,並且存在以下所有格式:example1.com,test.com,stackoverflow.com,google.com,那很容易。不過,我也想組織子域名。考慮以下三個領域:如何以這種方式字母表的域名列表?

a.domain.com 
domain.com 
anotherdomain.com 

如果我把他們交給軟件按字母順序排列,他們會按字母順序排列如下:

a.domain.com 
anotherdomain.com 
domain.com 

然而,這不是我多麼希望他們按字母順序排列。我希望他們能夠通過域換句話說地按字母順序排列,然後通過子域的「搶七」,像這樣:

anotherdomain.com 
domain.com 
a.domain.com 

有人能告訴我如何編寫PHP(或JavaScript)來做到這一點? (你可以假設每一個「網站」上的代碼,一個新的行。)

回答

7
$array = array(
    'b.domain.com', 
    'a.domain.com', 
    'domain.com', 
    'anotherdomain.com', 
    'php.net', 
    'example.com' 
); 

function sort_domains($domain1, $domain2) 
{ 
    $domain1 = array_reverse(explode('.', $domain1)); 
    $domain2 = array_reverse(explode('.', $domain2)); 
    // set $i to 0 if you want the TLD to be sorted 
    for($i = 1; ; $i++) 
    { 
     // Might be a good idea to store the value of the issets up here 
     if(isset($domain1[$i]) && isset($domain2[$i])) 
     { 
      $difference = strcmp($domain1[$i], $domain2[$i]); 
      if($difference != 0) 
      { 
       return $difference; 
      } 
      continue; 
     } 
     if(!isset($domain1[$i]) && !isset($domain2[$i])) 
     { 
      return 0; 
     } 
     return isset($domain1[$i]) ? 1 : -1; 
    } 
} 

usort($array, 'sort_domains'); 

/* 
Array 
(
    [0] => anotherdomain.com 
    [1] => domain.com 
    [2] => a.domain.com 
    [3] => b.domain.com 
    [4] => example.com 
    [5] => php.net 
) 
*/ 

編輯:

按參宿一的建議,這裏是sort_domains一個版本,緩存每個域​​的碎片名稱:

function sort_domains($domain1, $domain2) 
{ 
    static $cache = array(); 
    if(!array_key_exists($domain1, $cache)) 
    { 
     $cache[$domain1] = array_reverse(explode('.', $domain1)); 
    } 
    if(!array_key_exists($domain2, $cache)) 
    { 
     $cache[$domain2] = array_reverse(explode('.', $domain2)); 
    } 
    // set $i to 0 if you want the TLD to be sorted 
    for($i = 1; ; $i++) 
    { 
     $isset_1 = isset($cache[$domain1][$i]); 
     $isset_2 = isset($cache[$domain2][$i]); 
     if($isset_1 && $isset_2) 
     { 
      $difference = strcmp($cache[$domain1][$i], $cache[$domain2][$i]); 
      if($difference != 0) 
      { 
       return $difference; 
      } 
      continue; 
     } 
     if(!$isset_1 && !$isset_2) 
     { 
      return 0; 
     } 
     return $isset_1 ? 1 : -1; 
    } 
} 
+2

請注意,這對於小列表來說工作得很好,但對於大型列表來說效率很低,因爲爆炸和反向步驟是針對每個_comparison_而不是每個元素完成的。對於大型列表,將數據集標準化以便首先進行最佳比較,然後進行排序,然後再轉換回所需的格式。 – Alnitak 2011-04-11 16:47:24

+0

或者,在第一次遇到每個鍵時記憶每個鍵的標準化版本。 – Alnitak 2011-04-11 16:50:37

+0

你不知道我有多喜歡上面的解決方案:編輯過的。 :) 豎起大拇指! – Cogicero 2011-04-11 17:15:17

1

如果提供的所有參數都是這種形式的(並有.com後,沒有其他信息,你可以使用explode('.', 'a.domain.com')然後你就可以排序根據第二次的爆炸結果的最後一個項目的項目

相關問題