这是我对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);
}
}
通常,当我在任何的代码中看到前两行时,它会对我尖叫:重构!我想这是因为它们完全相同。
我知道我可以创建一个函数getCamelized()
,但我不认为我会在此之外再次使用它。
有没有办法将这4行变为2? func_get_args()
或array_walk()
可以帮助我吗?
此外,这个排序功能有什么问题吗?
答案 0 :(得分:1)
有没有办法改变这4行 进入2?
$sortA = $sortB = inflector::camelize(str_replace('-', '_', $this->sortBy));
其他两行:
list($a, $b) = array(Arr::get($a, $sortA), Arr::get($b, $sortB));
至于排序,至少对我来说似乎没问题。
答案 1 :(得分:1)
$sortA == $sortB
所以这部分只是重复。无论您在哪里设置$sortA
,都要计算一次$this->sortBy
。您遇到的Arr::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);
}
}
这样的事情。让驼峰部分脱离循环的主要思想。
答案 2 :(得分: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));
}