帮助在PHP中优化对usort函数的调用

时间:2010-02-18 06:48:40

标签: php kohana 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); 
        }


    }

通常,当我在任何的代码中看到前两行时,它会对我尖叫:重构!我想这是因为它们完全相同。

我知道我可以创建一个函数getCamelized(),但我不认为我会在此之外再次使用它。

有没有办法将这4行变为2? func_get_args()array_walk()可以帮助我吗?

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

3 个答案:

答案 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));
}