0

这是我的回调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()在这里帮助我吗?

另外,这个排序功能有什么问题吗?

4

3 回答 3

1

$sortA == $sortB所以那部分只是重复。计算$sortA一次,无论您在哪里设置$this->sortByArr::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); 
    }

}

类似的东西。使骆驼化部分脱离循环的主要思想。

于 2010-02-18T09:12:32.327 回答
1

有没有办法把这4行变成2行?

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

对于其他两行:

    list($a, $b) = array(Arr::get($a, $sortA), Arr::get($b, $sortB));

至于排序,至少对我来说似乎没问题。

于 2010-02-18T06:53:07.747 回答
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));
}
于 2010-02-18T14:26:13.363 回答