Помощь в оптимизации вызовов функции usort в PHP

StackOverflow https://stackoverflow.com/questions/2286793

  •  21-09-2019
  •  | 
  •  

Вопрос

Это мой обратный звонок для моего 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() помочь мне здесь?

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

$sortA == $sortB так что эта часть - просто дублирование.Вычислить $sortA один раз, где бы вы ни находились $this->sortByArr::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); 
    }

}

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

Имейте в виду , что 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));
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top