web2 logo

Arrays sorteren met array_multisort

Gebruik:
array_multisort ( array &$arr [, $arg = SORT_ASC [, $arg = SORT_REGULAR [, $... ]]] )

array_multisort() kan gebruikt worden om meerdere arrays tegelijkertijd te sorteren of om een mulidimensionale array op één of meer dimensies te sorteren.

Associatieve (string) sleutels blijven gehandhaafd, maar numerieke sleutels worden geherindexeerd.

Parameters:

arr : Een array die gesorteerd wordt.
arg : Optioneel een andere array, of sorteer opties voor het vorige array argument: SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING.
... : Nog meer arg's.

Voorbeeld 1 : meerdere arrays sorteren

<?php
$ar1 = array(10, 100, 100, 0);
$ar2 = array(1, 3, 2, 4);
array_multisort($ar1, $ar2);

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

In dit voorbeeld zal na het sorteren de eerste array 0, 10, 100, 100 bevatten. De tweede array zal 4, 1, 2, 3 bevatten. De elementen van de tweede array die overeenkomen met elementen die in de eerste array gelijk zijn, zijn ook gesorteerd.

array(4) {
    [0]=> 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)
}

Voorbeeld 2 : een multidimensionale array sorteren

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

In dit voorbeeld zal na het sorteren de eerste array bevatten: "10", 100, 100, 11, "a" (gesorteerd als strings in oplopende volgorde). De tweede array zal bevatten: 1, 3, "2", 2, 1 (gesorteerd als nummers in aflopende volgorde).

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

Voorbeeld 3 : database resultaten sorteren

In dit voorbeeld is elk element van de data array een rij in een tabel.

Voorbeeld data:

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

De data is een array met de naam data. Deze wordt meestal verkregen door mysqli_fetch_assoc() in een loop te gebruiken.

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

In dit voorbeeld wordt volume aflopend en editie oplopend gesorteerd.

We hebben een array van rijen, maar array_multisort() verlangt een array van kolommen:

<?php
// Een lijst van kolommen verkrijgen
foreach ($data as $key => $row) {
    $volume[$key]  = $row['volume'];
    $editie[$key] = $row['editie'];
}

// Voeg $data als de laatste parameter toe, te sorteren op de  gemeenschappelijke sleutel
array_multisort($volume, SORT_DESC, $editie, SORT_ASC, $data);
?>

De gegevens zijn nu als volgt gesorteerd:

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

Voorbeeld 4 : sorteren zonder verschil te maken tussen hoofdletters en kleine letters

Zowel SORT_STRING als SORT_REGULAR zijn hoofdletter gevoelig, strings die starten met een hoofdletter komen voor strings die starten met een kleine letter.

Om te sorteren zonder verschil te maken tussen hoofdletters en kleine letters moet de sorteervolgorde bepaald worden door een kleine letter kopie van de originele array.

<?php
$array = array('Alpha', 'appel', 'Beta', 'banaan');
$array_lowercase = array_map('strtolower', $array);

array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array);

print_r($array);
?>

Het bovenstaande zal opleveren:

Array
(
    [0] => Alpha
    [1] => appel
    [2] => banaan
    [3] => Beta
)

Toegevoegd door: Kees de Keijzer
Twitter: @kdkq

~ php ~

~ Onderwerpen ~

Dit is een website zonder pop-ups

~ Links ~

Design & Development by Cyberwebdesign.nl for web2.nl © 2020.