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?

Était-ce utile?

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));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top