2013-04-02 23 views
12

Mam tablicę, która wygląda tak:Sortowanie tablicy i zachować wartości kluczy

Array 
(
    [team1] => Array 
     (
      [points] => 10 
      [players] => Array 
       (
        ... 
       ) 
     ) 

    [team2] => Array 
     (
      [points] => 23 
      [players] => Array 
       (
        ... 
       ) 
     ) 

    ... many more teams 
) 

i chciałbym aby posortować zespoły przez liczbę punktów każda drużyna ma. Próbowałem to:

function sort_by_points($a,$b) 
{ 
    if ($a['points']==$b['points']) return 0; 
     return ($a['points']<$b['points'])?1:-1; 
} 

usort($this->wordswithdata, "sortbycount"); 

Ale to podejście zastępuje klucze zawierające teamnames i powroty:

Array 
(
    [0] => Array 
     (
      [points] => 23 
      [players] => Array 
       (
        ... 
       ) 
     ) 

    [1] => Array 
     (
      [points] => 10 
      [players] => Array 
       (
        ... 
       ) 
     ) 

    etc... 
) 

jest jakiś sposób aby posortować tablicę bez nadpisywania teamnames jako klucze tablicy?

Odpowiedz

19

Użyj funkcji uasort, że należy zachować klucz => wartość stowarzyszenia nienaruszone.

(dygresja: można zrobić return $a['points'] - $b['points'] zamiast IFS)

-1

Spróbuj tego kodu, mam nadzieję, że zadziała.

function aasort (&$array, $key) { 
    $sorter=array(); 
    $ret=array(); 
    reset($array); 
    foreach ($array as $ii => $va) { 
     $sorter[$ii]=$va[$key]; 
    } 
    asort($sorter); 
    foreach ($sorter as $ii => $va) { 
     $ret[$ii]=$array[$ii]; 
    } 
    $array=$ret; 
} 

aasort($your_array,"points"); 
12

Można użyć uasort:

uasort($array, function($a, $b) { 
    return $a['points'] - $b['points']; 
}); 

Ta funkcja sortuje tablicę tak, że indeksy tablicy utrzymać ich korelację z elementy tablicy, z którymi są powiązane, za pomocą zdefiniowanej przez użytkownika funkcji porównania.

Powiązane problemy