php中的Usort返回搞砸了结果

时间:2016-01-26 21:37:07

标签: php

之前的对象:

    0 => 
        object(stdClass)[130]
          public 'id' => int 17
          public 'account_id' => int 18
          public 'rank' => int 1
          public 'skill' => string '0.0000' (length=6)
      1 => 
        object(stdClass)[131]
          public 'id' => int 33
          public 'account_id' => int 19
          public 'levels' => int 0
          public 'rank' => int 3
          public 'skill' => string '0.0000' (length=6)
      2 => 
        object(stdClass)[132]
          public 'id' => int 23
          public 'account_id' => int 24
          public 'rank' => int 2
          public 'skill' => string '0.0000' (length=6)
3 => 
        object(stdClass)[133]
          public 'id' => int 23
          public 'account_id' => int 24
          public 'rank' => int 11
          public 'skill' => string '0.0000' (length=6)

我正在使用以下功能

usort($results, function($a, $b)
        {
            return strcmp($a->rank, $b->rank);
});

取而代之的$ results会像这样排序:1,2,3,11。 对象的排序方式如下:1,11,2,3

2 个答案:

答案 0 :(得分:0)

那是因为strcmp用于 STRINGS 。这意味着字符串比较规则适用,11 < 3TRUE,因为字符串是逐字符比较的。

e.g。

1234
==<*
124

通过整数规则,int(124)小于int(1234),但是比字符串(1234)更大,因为3小于4

尝试

return $a->rank - $b->rank;

用于比较功能。

php > var_dump(strcmp('123', '1234'));   
int(-1)  <--"less than"
php > var_dump(strcmp('124', '1234'));
int(1)   <-- "greater than"
php > var_dump(strcmp(123, 1234));
int(-1)
php > var_dump(strcmp(124, 1234));
int(1)

答案 1 :(得分:0)

usort($results, function($a, $b)
        {
            if ($a->rank == $b->rank) {
                return 0;
            }
            return ($a->rank < $b->rank) ? -1 : 1;
        });

以下工作来自http://php.net/manual/en/function.uasort.php