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?

¿Fue útil?

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));
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top