Frage

Das ist mein Rückruf für meine 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); 
        }


    }

Normalerweise, wenn ich die ersten zwei Zeilen in sehen jede von meinem Code, es mir schreit:. refactor Ich denke, es ist, weil sie identisch sind

Ich weiß, ich könnte eine Funktion getCamelized() machen, aber ich glaube nicht, dass ich es wieder außerhalb dieser verwenden würde.

Gibt es eine Möglichkeit, diese vier Linien in 2 zu drehen? Könnte mir func_get_args() oder array_walk() Hilfe hier?

Auch ist es etwas falsch über diese Sortier-Funktion?

War es hilfreich?

Lösung

  

Gibt es eine Möglichkeit, diese 4 Zeilen zu drehen   in 2?

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

Und für andere zwei Zeilen:

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

Wie für Art, scheint es in Ordnung zu sein, zumindest für mich.

Andere Tipps

$sortA == $sortB so dass ein Teil ist nur Duplikation. Berechnen Sie $sortA einmal, wo Sie setzen $this->sortBy. Die Arr::get Linien sind Sie stecken mit. Die return $a < $b; scheint falsch, sollten Sie eine -ve zurückkehren, 0, + Anzahl 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); 
    }

}

So ähnlich. Die Hauptidee den camelizing Teil aus der Schleife zu erhalten.

Beachten Sie, dass strcasecmp einen int zurück (1, 0 oder -1) und < einen boolean zurück. Sie müssen wirklich mit dem einen oder anderen sein. Beachten Sie auch, dass strnatcasecmp werden Sie wahrscheinlich das Verhalten geben Sie für beide Zahlen wollen und Strings so versuchen Sie dieses:

public function sortProperties($a, $b) {
  $aInflected = Arr::get($a, $sort = inflector::camelize(str_replace('-', '_', $this->sortBy)));
  return strcasecmp($aInflected, Arr::get($b, $sort));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top