Aiuto per ottimizzare le chiamate alla funzione usort in PHP
Domanda
Questa è la mia callback per la mia 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);
}
}
Di solito, quando vedo le prime 2 linee in qualsiasi del mio codice, si urla a me: refactoring Credo che sia perché sono identici
So che avrei potuto fare una funzione di getCamelized()
, ma non credo che userei di nuovo al di fuori di questo.
C'è un modo per trasformare quelle 4 linee in 2? Potrebbe func_get_args()
o array_walk()
aiutarmi qui?
Inoltre, è qualcosa che non va su questa funzione di ordinamento?
Soluzione
C'è un modo per trasformare queste 4 righe in 2?
$sortA = $sortB = inflector::camelize(str_replace('-', '_', $this->sortBy));
E per altre due linee:
list($a, $b) = array(Arr::get($a, $sortA), Arr::get($b, $sortB));
Per quanto riguarda il tipo, sembra andare bene almeno a me.
Altri suggerimenti
$sortA == $sortB
in modo che una parte è solo la duplicazione. Calcola $sortA
una volta, ovunque si imposta $this->sortBy
. Le linee Arr::get
sei bloccato con. Il return $a < $b;
sembra sbagliato, si dovrebbe essere restituisce un ve, 0, + ve numero.
...
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);
}
}
Qualcosa del genere. L'idea principale per ottenere la parte camelizing fuori dal giro.
Si tenga presente che strcasecmp
restituirà un int (1, 0, o -1) e <
restituirà un valore booleano. Hai davvero bisogno di essere utilizzando uno o l'altro. Si noti inoltre che strnatcasecmp
probabilmente vi darà il comportamento desiderato sia per i numeri e stringhe in modo da provare questo:
public function sortProperties($a, $b) {
$aInflected = Arr::get($a, $sort = inflector::camelize(str_replace('-', '_', $this->sortBy)));
return strcasecmp($aInflected, Arr::get($b, $sort));
}