2017-10-02 2 views
0

私はPHP型のジャグリングを試していましたが、私は説明できない凶悪な振る舞いを見つけました。私は時には文字列、時には数字であるプロパティに基づいてオブジェクトをソートしていました。 usortを使用すると、いくつかの項目が不調になります。なぜ私は理解できません。私はPHP 7.0.16を使用しています。文字列と数値をPHPで並べる

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 :Jose 9:Lucas

通知どのように項目4.2と5が故障しているか。何故ですか?

答えて

1

問題は浮動小数点値です。あなたはdocumentation読めば、あなたは見つけるでしょう:最初の引数は、それぞれ、より少ない等しいかそれ以上であるとみなされた場合

比較関数に等しい、またはゼロより大きい、より小さい整数を返す必要があります二番目。

そして:floatのような比較関数から非整数値を、返す

注意 、コールバックの戻り値の整数に内部のキャストになります。そのため、0.99や0.1などの値は両方とも0の整数値にキャストされ、その値は等しいとみなされます。

0

私は、SPL(http://php.net/manual/en/array.sorting.php)で利用可能な配列ソートオプションを調べる必要があると考えています。英数字を使用して値でソートする必要があります。また、キーと値の関連付けは気にしません。それは本当に私たちの選択肢を開きます。

usort(...)の代わりに他の配列並べ替えオプションを試してみてください。私は、カバーされていないソートパターンを見つけようとしている。

関連する問題