我正在尝试使用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项是如何出错的。那是为什么?
答案 0 :(得分:1)
问题是浮动值。如果您阅读documentation,您会发现:
如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。
和
注意 从比较函数返回非整数值(例如float)将导致内部强制转换为回调返回值的整数。因此,诸如0.99和0.1之类的值都将被转换为整数值0,这将将这些值比较为相等。
答案 1 :(得分:0)
我认为我们需要查看SPL中可用的数组排序选项(http://php.net/manual/en/array.sorting.php)。我们希望使用字母数字字符按值排序,并且我们不关心键/值关联。这真的打开了我们的选择。
尝试使用其他一些数组排序选项代替usort(...)
。我找到了一个未涵盖的排序模式。