这是我的回调为我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));
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top