2012-08-29 5 views
13

PHP 5.4 wprowadza użyteczne SORT_FLAG_CASE, aby uczynić dowolną inną wyszukiwarkę nieodczuwalną. Niestety to nie jest dostępne w PHP 5.3 lub mniej, a więc zastanawiałem się, jak po tablicy:Sortowanie kluczy nierozróżniające wielkości liter w PHP w wersji 5.3 lub mniejszej

array('a'=>2,'b'=>4,'A'=>1,'B'=>3); 

Może być klasyfikowane do:

array('A'=>1,'a'=>2,'B'=>3,'b'=>4); 

Jak zwykle ksort() funkcji sortuje je jako:

array('A'=>1,'B'=>3,'a'=>2,'b'=>4); 
+0

mogę” zaakceptuj to do 2 dni po wysłaniu. – M1ke

+0

Dobrze, zapomniałem o tym, więc proszę przypomnieć za jednym + dni;) – hakre

+0

Oczywiście, nie ma problemu. – M1ke

Odpowiedz

23

Komentarz na jednej ze stron odniesienia funkcji PHP wskazał mi funkcję uksort(); ta (i funkcja uasort() do sortowania według wartości zamiast klucza) pozwala algorytmowi porównywania do zmiany w sortowaniu szybkim, który zostanie zapisany przez użytkownika.

W połączeniu z bardzo prostego strcasecmp() funkcji (który porównuje dwa ciągi znaków i zwraca < 0 dla> B i> 0 dla a> b) daje:

uksort($array, 'strcasecmp'); 

Aby łatwo osiągnąć efekt:

ksort($array,SORT_STRING | SORT_FLAG_CASE); 

W PHP 5.3 lub mniej.

+3

Jezu, jak php może mieć tak skręcony system sortowania? I zgodnie z dokumentami: sort ($ words, SORT_STRING | SORT_FLAG_CASE); powinieneś rozróżniać wielkość liter, ale nie działa: – 7stud

+0

Ten parametr będzie działał, ale tylko w PHP 5.4. PHP ma wiele wad ze względu na wiek i wykorzystanie, ale nowsze aktualizacje koncentrują się na zaostrzaniu spójności języka i zapewniają funkcje, do których przyzwyczajono inne języki. – M1ke

+0

jak można by zmienić uksort ($ array, 'strcasecmp'); sortować w odwrotnej kolejności? – Flion

1

To jak mam sortowane (wielkość liter ma znaczenie) Tablica ciągów znaków utf8 w PHP 7:

uksort($myarray, function ($a, $b) { 
    $a = mb_strtolower($a); 
    $b = mb_strtolower($b); 
    return strcmp($a, $b); 
}); 

dla PHP 5.3 trzeba stworzyć własną funkcję sortowania:

function mySort1($a, $b) { 
    $a = mb_strtolower($a); 
    $b = mb_strtolower($b); 
    return strcmp($a, $b); 
} 
uksort($result['rows'], 'mySort1'); 
Powiązane problemy