2012-03-24 8 views
4
<?php 

    $a = array(
     'a'=>'7833', 
     'd'=>'1297', 
     'c'=>'341', 
     '1'=>'67', 
     'b'=>'225', 
     '3'=>'24', 
     '2'=>'44', 
     '4'=>'22', 
     '0'=>'84' 
    ); 

    ksort($a); 

    print_r($a); 

Der obige Code erzeugt die folgende Ausgabe.ksort erzeugt ein falsches Ergebnis bei alphanumerischen Zeichen

Array 
(
    [0] => 84 
    [a] => 7833 
    [b] => 225 
    [c] => 341 
    [d] => 1297 
    [1] => 67 
    [2] => 44 
    [3] => 24 
    [4] => 22 
) 

Warum ksort falsches Ergebnis geben?

+1

Was würden Sie als ** richtiges ** Ergebnis betrachten? – salathe

+0

Ich muss den Index basierend auf der ASCII-Tabellenreihenfolge sortiert bekommen. –

+0

Wo würde '10' hingehen, zwischen' 1' und '2' oder nach' 9'? – salathe

Antwort

10

Sie möchten das SORT_STRING-Flag verwenden. SORT_REGULAR würden Einzelteile mit ihren aktuellen Typen vergleichen, wobei in diesem Fall die Nummer 1 kam nicht nach dem String ‚a‘:

php -r "echo 1 > 'a' ? 'yes' : 'no';" // yes 
+1

+1 Sie sind nur die Person hier, die die Frage beantwortet "Warum gibt ksort ein falsches Ergebnis?" – Wh1T3h4Ck5

+0

@ Wh1T3h4Ck5 nein er ist nicht. – salathe

+1

@ Wh1T3h4Ck5 Sie haben Recht. Nur eine Lösung zu geben kann helfen, unser Problem zu lösen. Aber es wird uns nicht helfen, unsere Programmierfähigkeiten zu verbessern. –

1

Versuchen Sie ksort($a, SORT_STRING), Zeichenfolgevergleiche auf den Schlüsseln zu erzwingen.

-1

Siehe diese Seite für einen Überblick über die verschiedenen Sortierfunktionen in php: http://php.net/manual/en/array.sorting.php

Wenn Sie es Schlüssel sortiert werden sollen, dann verwenden asort(), die diese Ausgabe erzeugt:

Array 
(
    [4] => 22 
    [3] => 24 
    [2] => 44 
    [1] => 67 
    [0] => 84 
    [b] => 225 
    [c] => 341 
    [d] => 1297 
    [a] => 7833 
) 
+0

Das sortiert nicht die Schlüssel, das sortiert die Werte. –

7

Die Standardsortierung verwendet SORT_REGULAR.

Dies nimmt die Werte und vergleicht sie wie auf der Handbuchseite beschrieben. Für die Zeiten, in denen die String-Schlüssel in Ihrem Beispiel mit Null verglichen werden; Diese Zeichenfolgen werden zum Vergleich in Zahlen umgewandelt (alle 0). Wenn zwei Mitglieder als gleich vergleichen, ist ihre relative Reihenfolge im sortierten Array undefiniert. (Zitiert von usort() manual page.)

Wenn die sortierte Ausgabe Nummern vor Buchstaben haben soll, sollten Sie SORT_NATURAL ab PHP 5.4 verwenden. SORT_STRING wird auch den Job nur tun, wenn die Zahlen einzelne Ziffern bleiben.

SORT_NATURAL (PHP 5.4 oder höher) gibt Tasten geordnet als:

0,1,2,4,11,a,b,c 

SORT_STRING ergibt Schlüssel geordnet als:

0,1,11,2,4,a,b,c 

Eine Alternative zu SORT_NATURAL für PHP weniger als 5.4, wäre uksort() verwenden.

uksort($a, 'strnatcmp');