2010-01-17 11 views
10

Chcę sortować wartości tablicy w kolejności alfabetycznej w PHP. Jeśli wszystkie wartości zaczynały się od tego samego znaku, należy je posortować za pomocą drugiego znaku i tak dalej. Ignoruj ​​wielkość liter.PHP: Jak sortować wartości tablicy w kolejności alfabetycznej?

Dla przykładu:

before: 
values[0] = "programming"; 
values[1] = "Stackoverflow"; 
values[2] = "question"; 
values[3] = "answers"; 
values[4] = "AA Systems"; 

after: 
values[0] = "AA Systems"; 
values[1] = "answers"; 
values[2] = "programming"; 
values[3] = "question"; 
values[4] = "Stackoverflow"; 

Znalazłem kilka algorytmów, ale chcę sposób, który jest szybki i niewielkiej liczby sprawozdań. Ignorowanie wielkości liter ma szczególne znaczenie dla mnie. Dzięki.

Odpowiedz

5

Twój przykład sprawia, że ​​dwa założenia:

  1. że masz do czynienia tylko z prostych, 1-wymiarowych tablic.

  2. Po sortowaniu alfabetycznym indeks zostanie zaktualizowany tak, że pierwszemu elementowi alfabetycznie zostanie przypisany klawisz 0 i tak dalej.

Biorąc pod uwagę te parametry, najprostszym rozwiązaniem jest użycie metody tablicowej sort(). Z Twojego przykład:

$values[0] = "programming"; 
$values[1] = "Stackoverflow"; 
$values[2] = "question"; 
$values[3] = "answers"; 
$values[4] = "AA Systems"; 

sort($values); 

co spowoduje następujące:

Array { 
    [0] => AA Systems 
    [1] => Stackoverflow 
    [2] => answers 
    [3] => programming 
    [4] => question 
} 

Istnieje other array sorting functions które mogłyby być lepsze dopasowanie. Na przykład, ten prosty, którego używam powyżej, umieszcza wielką literę przed małą literą, więc jeśli miałbyś "zabezpieczenie" jako przedmiot (wszystkie małe litery), poszedłby za "Stackoverflow", ponieważ duża liczba to s. mają pierwszeństwo przed se vs. st. Uporządkować sprawy bez czułości, można użyć natcasesort(), które produkują następujące z danej tablicy:

Array { 
    [0] => AA Systems 
    [1] => answers 
    [2] => programming 
    [3] => question 
    [4] => Stackoverflow 
} 
+0

Sort uwzględnia wielkość liter. Stackoverflow zostanie umieszczony * przed * odpowiedziami. – Tyzoid

4

Począwszy od wersji 5.4.0, można po prostu użyć dowolnego z sort, asort, ksort, etc działa i przekazuje flagę SORT_FLAG_CASE.

sort($array, SORT_FLAG_CASE); // Non-associative array 
asort($array, SORT_FLAG_CASE); // Associative array 
ksort($array, SORT_FLAG_CASE); // Associative array, sort by indices 

Jeśli masz starszą wersję i nie są gotowe do aktualizacji (lub nie mogą), można użyć natcasesort jak wspominają inni, ale także warianty uasort i ksort z strcasecmp jako zwyczaju funkcja:

natcasesort($array);   // Non-associative array 
uasort($array, 'strcasecmp'); // Associative array 
uksort($array, 'strcasecmp'); // Associative array, sort by indices 

Możesz zastosować tę samą koncepcję do każdej innej wersji sorting functions.

+0

Właściwa odpowiedź dla tego pytania to '' ksort ($ data, SORT_FLAG_CASE | SORT_NATURAL); '' ' –

0

Można użyć uasort(): http://php.net/manual/en/function.uasort.php

uasort($arr, 'strcasecmp'); 

Drugi argument jest funkcją, która porównuje wartości. Funkcja musi zwrócić wartość -1, 0 lub 1. Oto szablon, którego możesz użyć do własnych funkcji.

function cmp($a, $b) { 
    if ($a == $b) return 0; 
    elseif ($a > $b) return 1; 
    elseif ($a < $b) return -1; 
} 

uasort($arr, 'cmp'); 

Po sortowaniu może chcesz zresetować indeksy tablicy.

$arr = array_values($arr); 
Powiązane problemy