2012-01-04 34 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