Forum und email

array_multisort

(PHP 4, PHP 5)

array_multisort — Sorterer flere eller flere-dimensionelle arrays

Beskrivelse

bool array_multisort ( array $ar1 [, mixed $arg [, mixed $... [, array $... ]]] )

Returnerer TRUE ved succes, FALSE ved fejl.

array_multisort() kan brugs til at sorterer flere arrays på en gang eller sorterer et flere-dimensionel array med en eller flere dimensioner.

Associativt (streng) nøgler vil følge deres værdier, men nøgler bestående af tal, vil blive nulstillet.

De arrays som bliver givet om input, bliver behandler som kolonne - det betyder at den virker på samme måde som SQL metoden ORDER BY. Det første array er den primære der bliver sorteret på. De rækker (værdier) som er ens i det array, vil blive sorteret ved det næste array osv.

Rækkefølgen af argumenterne i denne funktion kan virke lidt unormal, men fleksibel. Det første argument skal være et array. Derefter kan hvert argument enten være et nyt array eller en sorteringsnøgle fra denne liste.

Rækkefølge sorteringsnøgler:

  • SORT_ASC - Sorterer i stigende rækkefølge
  • SORT_DESC - Sorterer i faldende rækkefølge

Type sorteringsnøgler:

  • SORT_REGULAR - Sammenligner elementer normalt
  • SORT_NUMERIC - Sammenligner elementer som tal
  • SORT_STRING - Sammenligner elementer som strenge

Der kan ikke angives to sorteringsnøgler af den samme type kan vælge til det samme array. En sorteringsnøgle vælges efter det array argument som den skal gælde for. Nøglerne bliver resat til standard SORT_ASC og SORT_REGULAR før næste nye array argument.

Example#1 Sortering af flere arrays

<?php
$ar1 
= array("10"100100"a");
$ar2 = array(13"2"1);
array_multisort($ar1$ar2);

var_dump($ar1);
var_dump($ar2);
?>

I dette eksempel efter sortering, vil det første array indeholde "10", "a", 100, 100. Det andet array vil indeholde 1, 1, "2", 3. Elementer i det array array sammen med de identiske elementer i første array (100 og 100) bliver også sorteret.

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)
}

Example#2 Sortering af flere-dimensionel array

<?php
$ar 
= array(
       array(
"10"11100100"a"), 
       array(
12"2"31)
      );
array_multisort($ar[0], SORT_ASCSORT_STRING,
                
$ar[1], SORT_NUMERICSORT_DESC);
var_dump($ar);
?>

I dette eksempel vil, efter sortering, den første array indeholde "10", 100, 100, 11, "a" (det blev sorteret som strenge i stigende rækkefølge). Det andet array vil indeholde 1, 3, "2", 2, 1 (sorteret som numrer i faldende rækkefølge).

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)
  }
}

Example#3 Sortering af resultat fra database

Ved dette eksempel, hvert element i data arrayet repensentere en række i en tabel. Denne type af data er typisk et resultat fra indeholdet af en database.

Eksempel data:

volume | edition
-------+--------
    67 |       2
    86 |       1
    85 |       6
    98 |       2
    86 |       6
    67 |       7

data er et array som normalt blive lavet via en løkke sammen med mysql_fetch_assoc().

<?php
$data
[] = array('volume' => 67'edition' => 2);
$data[] = array('volume' => 86'edition' => 1);
$data[] = array('volume' => 85'edition' => 6);
$data[] = array('volume' => 98'edition' => 2);
$data[] = array('volume' => 86'edition' => 6);
$data[] = array('volume' => 67'edition' => 7);
?>

I dette eksempel, vil vi sortere volume faldende og edition stigende.

Vi har et array af rækker, men array_multisort() kræver et array af koloner, så vi kan bruge koden herunder til at fange kolonerne og derefter udføre sorteringen.

<?php
// Fremstiller en liste af koloner
foreach ($data as $key => $row) {
    
$volume[$key]  = $row['volume'];
    
$edition[$key] = $row['edition'];
}

// Sorterer 'volume' data faldende og 'edition' stigende
// Tilføjer $data som den sidste parameter så sorteringen sker direkte
// i det array.
array_multisort($volumeSORT_DESC$editionSORT_ASC$data);
?>

De forskellige data er nu sorteret og vil se sådan ud:

volume | edition
-------+--------
    98 |       2
    86 |       1
    86 |       6
    85 |       6
    67 |       2
    67 |       7

Example#4 Sortering uden hensyn til størrelsen af bogstaverne

Både SORT_STRING og SORT_REGULAR ser forskel på store og små bogstaver. Det vil sige at strenge som starter med stort bogstav, vil komme før strenge der starter med lille bogstav.

For at opnå en sorteting hvor der ikke blevet taget hensyn til overstående problemstilling, fremstilles der et array, hvor data kun består af små bogstaver.

<?php
$array 
= array('Alpha''atomic''Beta''bank');
$array_lowercase array_map('strtolower'$array);

array_multisort($array_lowercaseSORT_ASCSORT_STRING$array);

print_r($array);
?>

Ovenstående eksempel vil udskrive:

Array
(
    [0] => Alpha
    [1] => atomic
    [2] => bank
    [3] => Beta
)