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

Шварца Transform http://t3.dotgnu.info/blog/php/schwartzian-transform.html –

ответ

1

Есть ли способ повернуть эти 4 линии в 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

+0

'$ a = $ b = Arr :: get ($ a, $ sortA);' Не будет ли этот набор $ a и $ b для того, что будет $ a? – alex

+0

@Ben: см. Мой ответ снова plz – Sarfraz

1

$sortA == $sortB так что часть просто дублирование. Рассчитайте $sortA один раз, где бы вы ни установили $this->sortBy. Вы застряли в линиях 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

Возврат 'return $ a <$ b;' работает как я намеревался.Я полагаю, что положительное число = истинное или отрицательное число = false – alex

+0

'true' получает значение, равное' 1', 'false' получает значение' 0', и ваш вид лоботомизирован, потому что функция не может указывать числовые '$ a' больше чем '$ b'. Он также не совпадает с тем же значением, что и ваш strcasecmp, который будет возвращать -1, если '$ a <$ b'. Если это работает, и вы довольны этим, это не имеет значения, но это неправильно. – Mike

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