在php中排序字符串和数字

时间:2017-10-02 14:17:16

标签: php sorting type-conversion usort

我正在尝试使用PHP类型的杂耍,并发现了一个我无法解释的行为。我基于一个有时是字符串的属性对对象进行排序,有时候是一个数字。使用usort,有些项目不合适。我无法弄清楚为什么。我使用的是PHP 7.0.16。

class Classe {
    protected $data = array();
    public function Set($chave, $valor) {
        $this->data[$chave] = $valor;
    }
    public function Get($chave) {
        return $this->data[$chave];
    }
}
$objetos = array();
$nomes = array('Joao', 'Jose', 'Lucas', 'Antonio', 'Miguel', 'Arthur', 'Davi', 'Bernardo', 'Heitor', 'Gabriel');
$posicoes = array(7, '8.2', '9', 1.0, '5', 1.1, '3.2', '2', '4', 4.2);
for ($i = 0; $i < 10; ++$i) {
    $objeto = new Classe;
    $objeto->Set('pos', $posicoes[$i]);
    $objeto->Set('nome', $nomes[$i]);
    $objetos[] = $objeto;
}
foreach ($objetos as $o) {
    echo "{$o->Get('pos')}: {$o->Get('nome')}\n";
}
echo "\nAfter sorting:\n";
usort($objetos,
    function($a, $b) {
        return $a->Get('pos') - $b->Get('pos');
    });

foreach ($objetos as $o) {
    echo "{$o->Get('pos')}: {$o->Get('nome')}\n";
}

排序后的订单:

  

1:安东尼奥   1.1:亚瑟   2:贝尔纳多   3.2:戴维   4:Heitor   5:米格尔   4.2:加布里埃尔   7:若昂   8.2:何塞   9:卢卡斯

注意第4.2和第5项是如何出错的。那是为什么?

2 个答案:

答案 0 :(得分:1)

问题是浮动值。如果您阅读documentation,您会发现:

  

如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。

  

注意   从比较函数返回非整数值(例如float)将导致内部强制转换为回调返回值的整数。因此,诸如0.99和0.1之类的值都将被转换为整数值0,这将将这些值比较为相等。

答案 1 :(得分:0)

我认为我们需要查看SPL中可用的数组排序选项(http://php.net/manual/en/array.sorting.php)。我们希望使用字母数字字符按值排序,并且我们不关心键/值关联。这真的打开了我们的选择。

尝试使用其他一些数组排序选项代替usort(...)。我找到了一个未涵盖的排序模式。