array_multisort
Posortuj wiele tablic lub tablice wielowymiarowe
&reftitle.description;
boolarray_multisort
arrayarray1
mixedarray1_sort_orderSORT_ASC
mixedarray1_sort_flagsSORT_REGULAR
mixedrest
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 (typu string) są zachowywane, a indeksy
numeryczne są przenumerowywane.
¬e.sort-unstable;
¬e.reset-index;
&reftitle.parameters;
array1
Tablica do posortowania.
array1_sort_order
Kolejność sortowania dla poprzedniego argumentu tablicy. SORT_ASC
aby posortować rosnąco lub SORT_DESC, aby posortować malejąco.
Ten argument może byc zamieniony z array1_sort_flags
lub całkowicie pominięty - w tym wypadku zakładane jest użycie SORT_ASC.
array1_sort_flags
Opcje sortowania dla poprzedniego argumentu tablicy:
Flagi sortowania:
SORT_REGULAR - porównuj elementy normalnie
(nie zmieniając typów)
SORT_NUMERIC - porównuj elementy numerycznie
SORT_STRING - porównuj elementy jak ciągi znaków
SORT_LOCALE_STRING - porównuj elementy jak
ciągi znaków, z uwzględnieniem ustawień regionalnych (locale). Używane
ustawienia regionalne mogą być zmienione funkcją setlocale
SORT_NATURAL - porównuj elementy jak ciągi znaków,
używając "sortowania naturalnego" tak jak natsort
SORT_FLAG_CASE - może być połączona
(poprzez bitowe OR) z flagami
SORT_STRING lub
SORT_NATURAL aby posortować ciągi znaków bez rozróżniania wielkości liter
Ten argument może byc zamieniony z array1_sort_order
lub całkowicie pominięty - w tym wypadku zakładane jest użycie SORT_REGULAR.
rest
Więcej tablic, po których mogą następować flagi kolejności i opcji sortowania.
Porównywane są tylko elementy odpowiadające elementom w poprzednich tablicach.
Innymi słowy, sortowani jest leksykograficzne.
&reftitle.returnvalues;
&return.success;
&reftitle.examples;
Sortowanie wielu tablic
]]>
W tym przypadku, po sortowaniu, pierwsza tablica będzie zawierać 0,
10, 100, 100, a druga 4, 1, 2, 3.
Elementy drugiej tablicy odpowiadające identycznym
elementom pierwszej tablicy (100 i 100) także zostały posortowane.
int(0)
[1]=> int(10)
[2]=> int(100)
[3]=> int(100)
}
array(4) {
[0]=> int(4)
[1]=> int(1)
[2]=> int(2)
[3]=> int(3)
}
]]>
Sortowanie tablicy wielowymiarowej
]]>
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(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)
}
}
]]>
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:
Dane zawarte są w tablicy o nazwie dane. Efekt ten
można uzyskać np. wywołując w pętli funkcję mysqli_fetch_assoc.
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 użyjemy kodu poniżej, aby uzyskać kolumny,
a następnie przeprowadzić sortowanie.
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);
// Pobierz listę kolumn
foreach ($dane as $klucz => $wiersz) {
$numer[$klucz] = $wiersz['numer'];
$edycja[$klucz] = $wiersz['edycja'];
}
// Możesz użyć array_column() zamiast kodu wyżej
$numer = array_column($data, 'numer');
$edycja = array_column($data, '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);
// Przeiteruj się po danych i wyświetl posortowane wartości dla każdej z kolumn
echo 'numer | edycja', PHP_EOL;
echo '------+-------', PHP_EOL;
for ($i = 0; $i < count($data); $i++) {
printf("%5d | %6d\n", $volume[$i], $edition[$i]);
}
?>
]]>
Zbiór danych jest teraz posortowany. Wygląda on tak:
Sortowanie z ignorowaniem wielkości znaków
Zarówno SORT_STRING jak
SORT_REGULAR, powodują sortowanie z rozróżnianiem
wielkości znaków. Ciągi zaczynające się od dużej litery znajdą się
przed 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.
]]>
&example.outputs;
Alfa
[1] => atomowy
[2] => bank
[3] => Beta
)
]]>
&reftitle.seealso;
usort
&seealso.array.sorting;