Помощь в оптимизации вызовов функции usort в PHP
Вопрос
Это мой обратный звонок для моего 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->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);
}
}
Что-то в этом роде.Основная идея состоит в том, чтобы вывести верблюжью часть из цикла.
Имейте в виду , что 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));
}