PHPでusort関数の呼び出しを最適化するとヘルプ
質問
これは私の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));
}
所属していません StackOverflow