Ayudar con la optimización de las llamadas a la función usort en PHP
Pregunta
Esta es mi devolución de llamada para mi 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);
}
}
Por lo general, cuando veo las 2 primeras líneas en cualquier de mi código, que me grita: refactor supongo que es porque son idénticos
Sé que podría hacer una getCamelized()
función, pero no creo que haría uso de nuevo fuera de este.
¿Hay una manera de convertir esas 4 líneas en 2? Podría func_get_args()
o array_walk()
ayudarme aquí?
Además, ¿hay algo malo acerca de esta función de clasificación?
Solución
¿Hay una manera de convertir esas 4 líneas en 2?
$sortA = $sortB = inflector::camelize(str_replace('-', '_', $this->sortBy));
Y para otras dos líneas:
list($a, $b) = array(Arr::get($a, $sortA), Arr::get($b, $sortB));
En cuanto a la especie, que parece estar bien, al menos para mí.
Otros consejos
$sortA == $sortB
de modo que parte es sólo la duplicación. Calcular $sortA
vez allí donde se establece $this->sortBy
. Las líneas Arr::get
que está pegado con. El return $a < $b;
parece mal, usted debe devolver un -ve, 0, + ve número.
...
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);
}
}
Algo por el estilo. La idea principal de conseguir la parte camelizing fuera del circuito.
Tenga en cuenta que strcasecmp
devolverá un int (1, 0, o -1) y <
devolverá un booleano. Que realmente necesita para ser el uso de uno u otro. También tenga en cuenta que strnatcasecmp
probablemente le dará el comportamiento que desea tanto para los números y cadenas a fin de tratar la siguiente:
public function sortProperties($a, $b) {
$aInflected = Arr::get($a, $sort = inflector::camelize(str_replace('-', '_', $this->sortBy)));
return strcasecmp($aInflected, Arr::get($b, $sort));
}