开发者

Help with optimising calls to the usort function in PHP

开发者 https://www.devze.com 2022-12-20 07:46 出处:网络
This is my callback for my usort() public function sortProperties($a, $b) { $sortA = inflector::camelize(str_replace(\'-\', \'_\', $this->sortBy));

This is my callback for my usort()

public function sortProperties($a, $b) {

        $sortA = inflector::camelize(str_replace('-', '_', $this->sortBy));
        $sortB = inflector::camelize(str_replace('-', '_', $this开发者_如何学C->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); 
        }


    }

Usually, when I see the first 2 lines in any of my code, it screams to me: refactor! I guess it's because they are identical.

I know I could make a function getCamelized(), but I don't think I'd use it again outside of this.

Is there a way to turn those 4 lines into 2? Could func_get_args() or array_walk() help me here?

Also, is there anything wrong about this sorting function?


Is there a way to turn those 4 lines into 2?

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

And for other two lines:

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

As for sort, it seems to be fine at least to me.


$sortA == $sortB so that part is just duplication. Calculate $sortA once wherever you set $this->sortBy. The Arr::get lines you're stuck with. The return $a < $b; seems wrong, you should be returning a -ve, 0, +ve number.

...
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); 
    }

}

Something like that. The main idea to get the camelizing part out of the loop.


Be aware that strcasecmp will return an int (1, 0, or -1) and < will return a boolean. You really need to be using one or the other. Also note that strnatcasecmp will probably give you the behavior you want for both numbers and strings so try this one:

public function sortProperties($a, $b) {
  $aInflected = Arr::get($a, $sort = inflector::camelize(str_replace('-', '_', $this->sortBy)));
  return strcasecmp($aInflected, Arr::get($b, $sort));
}
0

精彩评论

暂无评论...
验证码 换一张
取 消