2012-01-04 37 views
0

我想通過一個子數組值來排序我的數組,我使用這個與uasort,但代碼是醜陋的,看起來它可以做得更好,因爲有很多重複的代碼。通過子數組值改進排序數組

我該如何改進這種開關/箱子的排序?

switch ($this->view->sort_key_num) { 
    case 1: // Date 
     if ($this->view->sort_key_type == 1) 
     krsort($this->view->content); 
    break; 
    case 2: // Likes 
    function sort_like(&$a, &$b) { return ($a['likes'] > $b['likes']) ? 1 : -1; } 
    uasort($this->view->content, 'sort_like'); 
    if ($this->view->sort_key_type == 1) 
     $this->view->content = array_reverse($this->view->content); 
    break; 
    case 3: // new content 
    function sort_entries(&$a, &$b) { return ($a['newcontent'] > $b['newcontent']) ? 1 : -1; } 
    uasort($this->view->content, 'sort_entries'); 
    if ($this->view->sort_key_type == 1) 
     $this->view->content = array_reverse($this->view->content); 
    break; 
    case 4: // comments 
    function sort_comments(&$a, &$b) { return ($a['comments'] > $b['comments']) ? 1 : -1; } 
    uasort($this->view->content, 'sort_comments'); 
    if ($this->view->sort_key_type == 1) 
     $this->view->content = array_reverse($this->view->content); 
    break; 
    case 5: // facebook 
    function sort_facebook(&$a, &$b) { return ($a['facebook'] > $b['facebook']) ? 1 : -1; } 
    uasort($this->view->content, 'sort_facebook'); 
    if ($this->view->sort_key_type == 1) 
     $this->view->content = array_reverse($this->view->content); 
    break; 
    case 6: // twitter 
    function sort_twitter(&$a, &$b) { return ($a['twitter'] > $b['twitter']) ? 1 : -1; } 
    uasort($this->view->content, 'sort_twitter'); 
    if ($this->view->sort_key_type == 1) 
     $this->view->content = array_reverse($this->view->content); 
    break; 
    case 7: // email 
    function sort_email(&$a, &$b) { return ($a['email'] > $b['email']) ? 1 : -1; } 
    uasort($this->view->content, 'sort_email'); 
    if ($this->view->sort_key_type == 1) 
     $this->view->content = array_reverse($this->view->content); 
    break; 
    case 8: // google 
    function sort_google(&$a, &$b) { return ($a['google'] > $b['google']) ? 1 : -1; } 
    uasort($this->view->content, 'sort_google'); 
    if ($this->view->sort_key_type == 1) 
     $this->view->content = array_reverse($this->view->content); 
    break; 
    case 10: // views 
    function sort_views(&$a, &$b) { return ($a['views'] > $b['views']) ? 1 : -1; } 
    uasort($this->view->content, 'sort_views'); 
    if ($this->view->sort_key_type == 1) 
     $this->view->content = array_reverse($this->view->content); 
    break; 
} 

回答

1

我沒有做過所有的測試用例,也沒有詳細閱讀它們,但我認爲這將是你的代碼的一個很好的優化...

class customSorter { 
    private $sortCrit = NULL; 
    public function __construct($criteria){ 
      $this->sortCrit = $criteria; 
    } 
    public function sort(&$a, &$b) { return ($a[$this->sortCrit] > $b[$this->sortCrit]) ? 1 : -1; } 
} 

switch ($this->view->sort_key_num) { 
    case 1: // Date 
     if ($this->view->sort_key_type == 1){ 
      krsort($this->view->content); 
     } 
     break; 

    case 2: // Likes 
     uasort($this->view->content, array(new customSorter('likes'), 'sort')); 
     break; 

    case 3: // new content 
     uasort($this->view->content, array(new customSorter('newcontent'), 'sort')); 
     break; 

    case 4: // comments 
     uasort($this->view->content, array(new customSorter('comments'), 'sort')); 
     break; 

    case 5: // facebook 
     uasort($this->view->content, array(new customSorter('facebook'), 'sort')); 
     break; 
} 

//Reverse the sort? 
if ($this->view->sort_key_type == 1){ 
    $this->view->content = array_reverse($this->view->content); 
} 
1

你可以創建一個類來根據type排序。

class Sorter { 
    private $type; 
    private $content; 
    public function __construct($content) 
    { 
     $this->content = $content; 
    } 
    public function sort($type) 
    { 
     $this->type = $type; 
     uasort($this->content, function ($a,$b) { 
      return $b[$this->type] - $a[$this->type]; 
     }); 
    } 
} 

現在我刪除了日期部分,因爲這是一個特例。相反,我們分別處理日期部分。

if ($this->view->sort_key_type == 1 && $this->view->sort_key_num == 1) { 
    krsort($this->view->content); 
} 

如果事實證明這不是我們正在使用一個日期,我們創建了我們之前定義的分揀機類的實例,並給它你的數據 - 注意這是如何做參考。

else { 
    $sorter = new Sorter(&$this->view->content); 
    switch ($this->view->sort_key_num) { 
     case 2: $sorter->sort('likes'); break; 
     case 3: $sorter->sort('newcontent') break; 
     case 4: $sorter->sort('comments'); break; 
     case 5: $sorter->sort('facebook'); break; 
      ... 
    } 
} 

在你的舊代碼,你會扭轉你的末陣列,但是這是沒有必要的,因爲我已經扭轉你的比較方法(你給uasort的一個),所以代碼會按相反順序排序。

+0

雖然這段代碼是在5.3 php服務器上運行的, 5.2不支持此用戶建議的關閉。不錯的工作,但我仍然堅持在PHP 5.2,所以我沒有考慮關閉方式。看起來像我的,但有5.3的味道... – 2012-01-04 16:12:58

+0

@MathieuDumoulin感謝您的提示,不知道匿名函數沒有實現早。 – kba 2012-01-04 16:24:29