2010-02-18 107 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