0

これは私のコールバックです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); 
        }


    }

通常、コードの最初の2行を見ると、それは私に悲鳴を上げます:リファクタリング!同一だからだと思います。

関数を作成できることは知ってgetCamelized()いますが、これ以外で再び使用することはないと思います。

それらの4行を2行に変換する方法はありますか?ここで私を助けてくれませんかfunc_get_args()array_walk()

また、このソート機能に何か問題はありますか?

4

3 に答える 3

1

それらの4行を2行に変換する方法はありますか?

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

そして他の2行について:

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

並べ替えに関しては、少なくとも私には問題ないようです。

于 2010-02-18T06:53:07.747 に答える
1

$sortA == $sortBその部分は単なる複製です。$sortA設定した場所で1回計算します$this->sortByArr::getあなたが立ち往生している線。間違っているreturn $a < $b;ようです。-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); 
    }

}

そんな感じ。キャメル化部分をループから外すための主なアイデア。

于 2010-02-18T09:12:32.327 に答える
0

strcasecmpはint(1、0、または-1)<を返し、ブール値を返すことに注意してください。あなたは本当にどちらかを使用する必要があります。strnatcasecmpまた、数字と文字列の両方に必要な動作が得られる可能性があることにも注意してください。これを試してください。

public function sortProperties($a, $b) {
  $aInflected = Arr::get($a, $sort = inflector::camelize(str_replace('-', '_', $this->sortBy)));
  return strcasecmp($aInflected, Arr::get($b, $sort));
}
于 2010-02-18T14:26:13.363 に答える