2010-02-18 126 views
0

优化调用的usort功能这是我的回调我usort()帮助与PHP

public function sortProperties($a, $b) { 

     $sortA = inflector::camelize(str_replace('-', '_', $this->sortBy)); 
     $sortB = inflector::camelize(str_replace('-', '_', $this->sortBy)); 

     $a = Arr::get($a, $sortA); 
     $b = Arr::get($b, $sortB); 


     if (is_numeric($a) AND is_numeric($b)) { 
      return $a < $b; 
     } else { 
      return strcasecmp($a, $b); 
     } 


    } 

通常,当我看到第2行我的代码任何,它尖叫声对我说:重构!我想这是因为它们是相同的。

我知道我可以做一个功能getCamelized(),但我不认为我会再次使用它的这个之外。

有没有办法把这些4线到2? func_get_args()array_walk()可以帮我吗?

此外,有什么不好呢排序功能?

+0

的Schwartzian变换http://t3.dotgnu.info/blog/php/schwartzian-transform.html – 2010-02-18 07:43:18

回答

1

有没有办法将这四行 变成2?

$sortA = $sortB = inflector::camelize(str_replace('-', '_', $this->sortBy)); 

而对于其他两行:

list($a, $b) = array(Arr::get($a, $sortA), Arr::get($b, $sortB)); 

至于排序,这似乎是罚款至少对我来说。

+0

$ sortA = $ sortB和$ a = $ b会如何帮助? – Ben 2010-02-18 06:59:43

+0

'$ a = $ b = Arr :: get($ a,$ sortA);'这不会将$ a和$ b设置为$ a的值吗? – alex 2010-02-18 07:07:18

+0

@Ben:再次看到我的答案plz – Sarfraz 2010-02-18 07:07:47

1

$sortA == $sortB使部分只是重复。无论你在哪里设置$this->sortBy,计算一次$sortA。你坚持使用的Arr::get行。 return $a < $b;看起来不对,您应该返回一个-ve,0,+ ve数字。

... 
function setSortBy($sortBy) { 
    $this->sortBy = $sortBy; 
    $this->sortByCam = inflector::camelize(str_replace('-', '_', $sortBy)); 
} 
.... 

public function sortProperties($a, $b) { 

    $a = Arr::get($a, $this->sortByCam); 
    $b = Arr::get($b, $this->sortByCam); 

    if (is_numeric($a) && is_numeric($b)) { 
     return $a - $b; 
    } else { 
     return strcasecmp($a, $b); 
    } 

} 

就是这样的。让骆驼化部分脱离循环的主要想法。

+0

返回'返回$ a <$ b;'确实如此,我打算如何。我猜正数= true或负数= false – alex 2010-02-18 13:06:56

+0

'true'被转换为'1','false'转换为'0'并且你的排序被lobotomised,因为函数不能指示数字'$ a'更大比'$ b'。它也与你的strcasecmp不一样,如果'$ a <$ b'将返回-1。如果它正在工作,并且你对它感到满意,那么它并不重要,但它是不正确的。 – Mike 2010-02-18 16:40:03

0

请注意,strcasecmp将返回一个int(1,0或-1),而<将返回一个布尔值。你真的需要使用一个或另一个。还要注意的是strnatcasecmp可能会给你想要的数字和字符串的行为,以便试试这个:

public function sortProperties($a, $b) { 
    $aInflected = Arr::get($a, $sort = inflector::camelize(str_replace('-', '_', $this->sortBy))); 
    return strcasecmp($aInflected, Arr::get($b, $sort)); 
} 
+0

谢谢,那确实有效,而且不那么冗长。 +1 – alex 2010-02-18 23:45:28