2017-10-02 1 views
0

Ich experimentierte mit PHP-Typ Jonglieren und fand ein weibliches Verhalten, das ich nicht erklären kann. Ich sortierte Objekte basierend auf einer Eigenschaft, die manchmal eine Zeichenfolge, manchmal eine Zahl ist. Bei Verwendung von usort geraten einige Elemente fehl am Platz. Ich kann nicht herausfinden warum. Ich benutze PHP 7.0.16.Reihenfolge Strings und Zahlen in 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"; 
} 

Sortieren nach der Sortierung:

1: Antonio 1,1: Arthur 2: Bernardo 3.2: Davi 4: Heitor 5: Miguel 4.2: Gabriel 7: Joao 8.2 : Jose 9: Lucas

Hinweis wie die Punkte 4.2 und 5 außer Betrieb sind. Warum das?

Antwort

1

Das Problem ist der Float-Wert. Wenn Sie die documentation lesen, werden Sie finden:

Die Vergleichsfunktion eine ganze Zahl kleiner als, gleich oder größer als Null ist, wenn das erste Argument betrachtet wird zurückkehren müssen jeweils kleiner als, gleich oder größer als der Zweite.

Und:

Caution Zurückgeben nicht ganzzahlige Werte aus der Vergleichsfunktion, wie beispielsweise Schwimmer, werden in einem internen gegossenen zu ganzer Zahl von dem Rückgabewert des Rückrufs führen. Werte wie 0,99 und 0,1 werden also beide in einen ganzzahligen Wert von 0 umgewandelt, der solche Werte als gleich vergleicht.

0

Ich glaube, wir müssen die Array-Sortieroptionen in der SPL (http://php.net/manual/en/array.sorting.php) ansehen. Wir wollen nach Werten unter Verwendung alphanumerischer Zeichen sortieren, UND wir kümmern uns nicht um die Schlüssel/Wert-Zuordnung. Das eröffnet wirklich unsere Möglichkeiten.

Versuchen Sie einige der anderen Array-Sortieroptionen anstelle von usort(...). Ich habe ein Sortiermuster gefunden, das nicht abgedeckt wurde.

Verwandte Themen