Pergunta

Este é o meu retorno de chamada para o meu 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); 
        }


    }

Geralmente, quando vejo as duas primeiras linhas em algum do meu código, ele grita para mim: Refator! Eu acho que é porque eles são idênticos.

Eu sei que poderia fazer uma função getCamelized(), mas acho que não usaria novamente fora disso.

Existe uma maneira de transformar essas 4 linhas em 2? Poderia func_get_args() ou array_walk() me ajude aqui?

Além disso, há algo errado sobre essa função de classificação?

Foi útil?

Solução

Existe uma maneira de transformar essas 4 linhas em 2?

    $sortA = $sortB = inflector::camelize(str_replace('-', '_', $this->sortBy));

E para outras duas linhas:

    list($a, $b) = array(Arr::get($a, $sortA), Arr::get($b, $sortB));

Quanto ao tipo, parece estar bem pelo menos para mim.

Outras dicas

$sortA == $sortB Então essa parte é apenas duplicação. Calcular $sortA Uma vez onde você definir $this->sortBy. o Arr::get Linhas que você está preso. o return $a < $b; Parece errado, você deve retornar um número -Ve, 0, +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); 
    }

}

Algo parecido. A idéia principal de tirar a parte camelizante do loop.

Esteja ciente que strcasecmp retornará um int (1, 0 ou -1) e < Vai devolver um booleano. Você realmente precisa usar um ou outro. Observe também isso strnatcasecmp Provavelmente lhe dará o comportamento que você deseja para números e strings, então tente este:

public function sortProperties($a, $b) {
  $aInflected = Arr::get($a, $sort = inflector::camelize(str_replace('-', '_', $this->sortBy)));
  return strcasecmp($aInflected, Arr::get($b, $sort));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top