Programowanie w języku PHP » FAQ

Jak posortować tablice według konkretnej kolumny

Załóżmy że mamy "plik.txt" o zawartości:

  zuza|8|1
  ania|3|8
  ela|22|5
  ola|12|9

Wczytujemy go do tablicy:
 
  $tab = explode("\\n", str_replace("\\r", "", join("", file("plik.txt"))));

Teraz w tablicy $tab mamy kolejne linie pliku bez znaków końca (\\r i \\n).
Jeżeli przyjmiemy że kolejne elementy tej tablicy są mniejszymi tablicami
gdzie separatorem jest znak "|" to żeby posortować tę że tablice według
konkretnej kolumny, możemy posłużyć się taką funkcją:

  function sortbycol($tab, $sep, $n, $flag1, $flag2) {
      for($i = 0; $i < count($tab); $i++) {
          $t1 = explode($sep, $tab[$i]);
          $t2[] = $t1[$n];
      }
      array_multisort($t2, $flag1, $flag2, $tab);
      return $tab;
  }

  $tab = sortbycol($tab, "|", 0, SORT_STRING, SORT_DESC);
  echo join("&ltbr&gt", $tab);

Powyższy kod spowoduje wyświetlenie tablicy posortowanej alfabetycznie
malejąco według pierwszej kolumny:

  zuza|8|1
  ola|12|9
  ela|22|5
  ania|3|8

Opis argumentów funkcji sortbycol:

  $tab - tablica
  $sep - separator
  $n - numer kolumny indeksowany od zera
  $flag1 - flag typu sortowania,
    dostępne są następujące:
      SORT_REGULAR - porównuj elementy normalnie
      SORT_NUMERIC - porównuj elementy numerycznie
      SORT_STRING - porównuj elementy jak stringi
  $flag2 - flag porządku sortowania
    dostępne są następujące:
      SORT_ASC - sortuj w porządku rosnącym
      SORT_DESC - sortuj w porządku malejącym

Czyli jeśli chcielibyśmy uzyskać sortowanie numeryczne według drugiej kolumny
w porządku rosnącym:

  ania|3|8
  zuza|8|1
  ola|12|9
  ela|22|5

to powinniśmy posłużyć się takim kodem:

  $tab = sortbycol($tab, "|", 1, SORT_NUMERIC, SORT_ASC);
  echo join("&ltbr&gt", $tab);

...i to by było na tyle...

Do napisania tej pozycji FAQ zainspirował mnie test PHP ze strony
http://www.kedziora.info/testy/?id=15