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?

È stato utile?

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));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top