Помогите с оптимизацией вызовов функции usort в PHP - PullRequest
0 голосов
/ 18 февраля 2010

Это мой обратный звонок для моих usort()

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() помочь мне здесь?

Кроме того, что-то не так с этой функцией сортировки?

Ответы [ 3 ]

1 голос
/ 18 февраля 2010

$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); 
    }

}

Что-то в этом родеОсновная идея - вытащить верблюжью часть из цикла.

1 голос
/ 18 февраля 2010

Есть ли способ повернуть эти 4 линии в 2?

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

А для двух других строк:

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

Что касается сортировки, мне кажется, что это нормально, по крайней мере, мне.

0 голосов
/ 18 февраля 2010

Имейте в виду, что 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));
}
...