Forum und email
array_multisort

array_multisort

(PHP 4, PHP 5)

array_multisort -- Sortuje wiele tablic lub wielowymiarowe tablice

Opis

bool array_multisort ( array tbl1 [, mixed arg [, mixed ... [, array ...]]] )

Zwraca TRUE w przypadku sukcesu, FALSE w przypadku porażki.

array_multisort() może być użyta do sortowania kilku tablic na raz lub wielowymiarowej tablicy na podstawie jednego z większej liczby wymiarów.

Klucze asocjacyjne są zachowywane, a indeksy numeryczne są przenumerowywane.

Tablice wejściowe są traktowane jak kolumy tablicy, które mają być posortowane wierszami - odpowiada to funkcjonalności warunku SQL ORDER BY. Pierwsza tablica jest tablicą priorytetową do sortowania. Wiersze (wartości) w tej tablicą które są takie sane sortowane są według następnej tablicy wejściowej i tak dalej.

Struktura argumentów tej funkcji nie jest zwyczajna, ale jest ona elastyczna. Pierwszy argument musi być tablicą. Każdy następny argument musi być tablicą lub flagą oznaczającą porządek sortowania - jeden z poniższych.

Flagi porządku sortowania:

  • SORT_ASC - sortuj w porządku rosnącym

  • SORT_DESC - sortuj w porządku malejącym

Flagi typu sortowania:

  • SORT_REGULAR - porównuj elementy normalnie

  • SORT_NUMERIC - porównuj elementy numerycznie

  • SORT_STRING - porówuj elementy jak stringi

Nie można podać żadnych dwóch flag tego samego typu dla jednej tablicy. Flagi sortowania podane po argumencie-tablicy dotyczą tylko tej tablicy - są one zerowane do domyślnych wartośći SORT_ASC i SORT_REGULAR po każdym argumencie tablicowym.

Zwraca TRUE w przypadku sukcesu, FALSE w przypadku porażki.

Przykład 1. Sortowanie wielu tablic

<?php
$tbl1
= array ("10", 100, 100, "a");
$tbl2 = array (1, 3, "2", 1);
array_multisort ($tbl1, $tbl2);

var_dump($tbl1);
var_dump($tbl2);
?>

W tym przypadku, po sortowaniu, pierwsza tablica będzie zawierać 10, "a", 100, 100, a druga 1, 1, "2", 3. Elementy drugiej tablicy odpowiadające identycznym elementom pierwszej tablicy (100 i 100) także zostały posortowane.

array(4) {
  [0]=> string(2) "10"
  [1]=> string(1) "a"
  [2]=> int(100)
  [3]=> int(100)
}
array(4) {
  [0]=> int(1)
  [1]=> int(1)
  [2]=> string(1) "2"
  [3]=> int(3)
}

Przykład 2. Sortowanie wielowymiarowych tablic

$tbl = array (
      array ("10", 100, 100, "a"),
      array (1, 3, "2", 1)
   );
array_multisort ($tbl[0], SORT_ASC, SORT_STRING,
         $tbl[1], SORT_NUMERIC, SORT_DESC);
var_dump($tbl);
?>

W tym przykładzie, po posortowaniu, pierwsza tablica przekształci się do postaci "10", 100, 100, 11, "a" (została posortowana jako ciągi znakowe w porządku rosnącym). Druga tablica będzie zawierała elementy 1, 3, "2", 2, 1 (sortowanie liczbowe w porządku malejącym).

array(2) {
  [0]=> array(5) {
    [0]=> string(2) "10"
    [1]=> int(100)
    [2]=> int(100)
    [3]=> int(11)
    [4]=> string(1) "a"
  }
  [1]=> array(5) {
    [0]=> int(1)
    [1]=> int(3)
    [2]=> string(1) "2"
    [3]=> int(2)
    [4]=> int(1)
  }
}

Przykład 3. Sortowanie wyników zapytań do baz danych

Dla tego przykładu, każdy element tablicy dane reprezentuje pojedynczy wiersz z tabeli. Ten typ danych jest typowy dla rekordów baz danych.

Przykładowe dane:

Numer | edycja 
-------+--------
   67 |      2
   86 |      1
   85 |      6
   98 |      2
   86 |      6
   67 |      7

Dane zawarte są w tablicy o nazwie dane. Efekt ten można uzyskać, na przykład, poprzez wywołując w pętli funkcję mysql_fetch_assoc().

<?php
$dane
[] = array('numer' => 67, 'edycja' => 2);
$dane[] = array('numer' => 86, 'edycja' => 1);
$dane[] = array('numer' => 85, 'edycja' => 6);
$dane[] = array('numer' => 98, 'edycja' => 2);
$dane[] = array('numer' => 86, 'edycja' => 6);
$dane[] = array('numer' => 67, 'edycja' => 7);
?>

W tym przykładzie, dane zostaną posortowane według pola numer malejąco, oraz względem pola edycja rosnąco.

W zmiennej znajduje się tablica wierszy, lecz array_multisort() wymaga tablicy kolumn, tak więc należy zastosować poniższy kod aby uzyskać kolumny, a następnie przeprowadzić sortowanie.

<?php
// Pobierz listę kolumn
foreach ($dane as $klucz => $wiersz) {
    
$numer[$klucz]  = $wiersz['numer'];
    
$edycja[$klucz] = $wiersz['edycja'];
}

// Posortuj dane według numeru malejąco i edycji rosnąco
// Należy podać $dane jako ostatni parametr aby posortować według wspólnego
// klucza
array_multisort($numer, SORT_DESC, $edycja, SORT_ASC, $dane);
?>

Zbiór danych jest teraz posortowany. Wygląda on tak:

numer | edycja
------+--------
   98 |      2
   86 |      1
   86 |      6
   85 |      6
   67 |      2
   67 |      7

Przykład 4. Sortowanie z ignorowaniem wielkości znaków

Obie opcje, SORT_STRING i SORT_REGULAR, powodują sortowanie z rozróżnianiem wielkości znaków. Ciągi zaczynające się od dużej litery staną się ciągami zaczynającymi się od litery małej.

Aby przeprowadzić sortowanie ignorujące wielkość znaków, należy wymusić, aby porządek sortowania był określany przez kopię oryginalnej tablicy, w której wszystkie znaki zostaną zmienione na małe.

<?php
$tablica
= array('Alfa', 'atomowy', 'Beta', 'bank');
$tablica_male = array_map('strtolower', $tablica);

array_multisort($tablica_male, SORT_ASC, SORT_STRING, $tablica);

print_r($tablica);
?>

Powyższy przykład wyświetli:

Array
(
    [0] => Alfa
    [1] => atomowy
    [2] => bank
    [3] => Beta
)