Hilfe für Anrufe in der usort Funktion in PHP zu optimieren
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?
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));
}