题
这是我的回调为我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行 成2?
$sortA = $sortB = inflector::camelize(str_replace('-', '_', $this->sortBy));
和其他两行:
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