質問

これは私の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()を作ることができる知っているが、私はこの外に再びそれを使用したいとは思わない。

2に、これらの4行をオンにする方法はありますか?ここで私をfunc_get_args()またはarray_walk()助けてもらえますか?

また、そこに何が間違っているか?このソート機能についてです。

役に立ちましたか?

解決

  

これらの4行をオンにする方法はあります   2に?

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

そして、他の2つのラインについて

    list($a, $b) = array(Arr::get($a, $sortA), Arr::get($b, $sortB));
ソートとしては、少なくとも私には罰金のようです。

他のヒント

$sortA == $sortBその部分だけの重複ですので。あなたが$sortAを設定どこに一度計算$this->sortBy。あなたが立ち往生しているArr::getライン。 return $a < $b;は、あなたが-ve、0を返すべきである、間違っているようで、+数をましています。

...
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); 
    }

}

そのような何か。ループの外にラクダの一部を取得するための主要なアイデアます。

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));
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top