Aide à l'optimisation des appels à la fonction usort en PHP
Question
Ceci est mon rappel pour mon 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);
}
}
En général, quand je vois les 2 premières lignes dans any de mon code, il crie à moi: refactor je suppose que c'est parce qu'ils sont identiques
Je sais que je pourrais faire une getCamelized()
fonction, mais je ne pense pas que je l'utilise à nouveau en dehors de cela.
Y at-il un moyen de transformer ces 4 lignes en 2? Pourrait func_get_args()
ou array_walk()
me aider?
En outre, il n'y a rien de mal à cette fonction de tri?
La solution
Y at-il un moyen de transformer ces 4 lignes dans 2?
$sortA = $sortB = inflector::camelize(str_replace('-', '_', $this->sortBy));
Et pour deux autres lignes:
list($a, $b) = array(Arr::get($a, $sortA), Arr::get($b, $sortB));
Comme pour le tri, il semble être bien au moins pour moi.
Autres conseils
$sortA == $sortB
de sorte qu'une partie est tout simplement double emploi. Calculer une fois $sortA
où vous définissez $this->sortBy
. Les lignes de Arr::get
vous êtes coincé avec. Le return $a < $b;
semble mal, vous devriez retournerez un -ve, 0, + ve nombre.
...
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);
}
}
Quelque chose comme ça. L'idée principale pour obtenir la partie camelizing hors de la boucle.
Sachez que strcasecmp
retourne un entier (1, 0 ou -1) et <
retournera un booléen. Vous avez vraiment besoin d'être en utilisant l'un ou l'autre. Notez également que strnatcasecmp
vous donnera probablement le comportement que vous voulez pour les nombres et les chaînes essayez donc celui-ci:
public function sortProperties($a, $b) {
$aInflected = Arr::get($a, $sort = inflector::camelize(str_replace('-', '_', $this->sortBy)));
return strcasecmp($aInflected, Arr::get($b, $sort));
}