2012-09-21 74 views
2

我正在開發一個功能,爲客戶端進行多層次排序(排序,缺乏更好的術語)。假設我們有不同的屬性,例如對象的列表:什麼是最好/最簡單的方法來做多層排序?

  • 名字 - 對象的名稱
  • 類型 - 對象類型
  • 日 - 一些日期屬性

比方說,我想整理列表首先按照時間順序,然後按對象類型,然後按字母順序排列。我會怎麼做呢?

目前我正在使用usort()傳入我自己的比較函數,它將上面的屬性轉換爲具有不同權重的整數;例如。如果主要排序是按日期排序的,我將它轉換爲某個整數,然後乘以1000,將下一層排序轉換爲整數(在本例中爲類型),再乘以100,依此類推,然後將其全部添加共同確定一個對象是否爲<或者另一個。

有沒有更簡單/優雅的解決方案?謝謝

編輯:澄清,有沒有更好的方法來做多層次的排序,而不是將所有內容都轉換爲「重量」?

+0

可能的重複http://stackoverflow.com/questions/124266/sort-object-in-php –

+0

這不是我在這裏問的,在那個線程中,它仍然在一個層次上排序。我在問是否有一種排序方式。 – kennypu

回答

4

基本上,你想要做的是使用一系列「短路」比較。一個天真的例子,上面給出的標準,可能看起來像這樣(未經):

function mySort($a, $b) { 
    if ($a->name < $b->name) { 
     return -1; 
    } 

    if ($a->name > $b->name) { 
     return 1; 
    } 

    // If we get this far, then name is equal, so 
    // move on to checking type: 
    if ($a->type < $b->type) { 
     return -1; 
    } 

    if ($a->type > $b->type) { 
     return 1; 
    } 

    // If we get this far, then both name and type are equal, 
    // so move on to checking date: 
    if ($a->date < $b->date) { 
     return -1; 
    } 

    if ($a->date > $b->date) { 
     return 1; 
    } 

    // If we get this far, then all three criteria are equal, 
    // so for sorting purposes, these objects are considered equal. 
    return 0; 
} 

正如我所說的,雖然,這是一個天真的解決方案,這是非常不可擴展的。我建議使用稍微更強大的解決方案,在那裏你的排序不會被硬編碼到排序方法中。採取這種方法,例如(未測試):

// These are the properties to sort by, and the sort directions. 
// They use PHP's native SORT_ASC and SORT_DESC constants. 
$this->_sorts = [ 
    'name' => SORT_ASC, 
    'type' => SORT_ASC, 
    'date' => SORT_ASC 
]; 

// Implemented as a class method this time. 
protected function _mySort($a, $b) { 
    foreach ($this->_sorts as $property => $direction) { 
     if ($a->{$property} < $b->{$property}) { 
      return $direction === SORT_ASC ? -1 : 1; 
     } 

     if ($a->{$property} > $b->{$property}) { 
      return $direction === SORT_ASC ? 1 : -1; 
     } 
    } 

    return 0; 
} 

現在,添加或去除不同的排序字段或排序方向是添加或修改一個數組元素一樣簡單。不需要修改代碼。

+0

很簡單!讓我看看我能否實現這一點,謝謝! – kennypu

相關問題