【问题标题】:ordering strings and numbers in php [duplicate]在php中排序字符串和数字[重复]
【发布时间】:2017-10-02 14:17:16
【问题描述】:

我在试验 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:海特 5:米格尔 4.2:加布里埃尔 7:若昂 8.2:何塞 9:卢卡斯

请注意项目 4.2 和 5 是如何出现问题的。这是为什么呢?

【问题讨论】:

    标签: php sorting type-conversion usort


    【解决方案1】:

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

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

    还有:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多